パターンに一致する行と各行の前の4行を表示します。

パターンに一致する行と各行の前の4行を表示します。

たとえば、次のファイルから:

CREATE SYNONYM I801XS07 FOR I8010.I801XT07
               *
ERROR at line 1:
ORA-00955: name is already used by an existing object


CREATE SYNONYM I801XS07 FOR I8010.I801XT07
               *
ERROR at line 1:
ORA-00955: name is already used by an existing object



Table altered.


Table altered.


Table altered.


Table altered.


Table altered.


Table altered.


Table altered.


Table altered.

DROP INDEX I8011I01
           *
ERROR at line 1:
ORA-01418: specified index does not exist



Index created.

ORA-このORA-行と前の4行を見つけて表示する方法が欲しいです。

CREATE SYNONYM I801XS07 FOR I8010.I801XT07
               *
ERROR at line 1:
ORA-00955: name is already used by an existing object

CREATE SYNONYM I801XS07 FOR I8010.I801XT07
               *
ERROR at line 1:
ORA-00955: name is already used by an existing object

DROP INDEX I8011I01
           *
ERROR at line 1:
ORA-01418: specified index does not exist

答え1

オプションは-Bまさにそれをgrepします:grep -B 4 ORA- your_file

GNUなしでgrep私はgrep4以下から適応しました。グリモワール sed チュートリアル:

#!/bin/sh

# grepB4: prints out 4 lines before and the line including pattern
# if there is only one argument, exit

case $# in 
    1);;
    *) echo "Usage: $0 pattern";exit;;
esac;

sed -n '
'/"$1"/' !{
    # does not match - add this line to the hold space
    H
    # bring it back into the pattern space
    x
    # Two lines would look like .*\n.*
    # Three lines look like .*\n.*\n.*
    # Delete extra lines - keep four
    s/^.*\n\(.*\n.*\n.*\n.*\)$/\1/
    # put it back in hold space
    x
}
'/"$1"/' {
    # matches - append the current line
    H
    # bring hold space contents into pattern space
    g
    # print the 4 lines
    p
    # add the mark
    a\
---
}'

使用法: grepB4 pattern < file

ブルース・エディガー回答本質的に同じことを行うので、awkその構文はsed

答え2

GNUユーティリティがなく、古いソースBSDまたはAT&T "grep"のみを持つHP-UXなどの古いシステムを使用しているとします。次のことができます。

#!/bin/sh

awk '/ORA-/ { print line1; print line2; print line3; print line4; print $0 }\
// {line1 = line2; line2 = line3; line3 = line4; line4 = $0}' $1

はい、誤ったエッジ条件がたくさんあります。しかし、欲しいものは何ですか?また、一部のデコードされ、古いオペレーティングシステムとハードウェアを使用していることを考慮すると、クールなエラーを処理するためのCPUパフォーマンスが十分ではない可能性があります。

答え3

awk 'NR == FNR && $0 ~ p {
  for (i = FNR; i >= FNR - l; i--)
    nr[i]; next
  }
FNR in nr  
BEGIN {
  ARGV[ARGC++] = ARGV[ARGC - 1]
  }' l=4 p=ORA- infile   

Solarisで使用ノックまたは/usr/xpg4/bin/awk

関連情報