패턴과 일치하는 라인과 각 라인 앞의 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   

솔라리스에서 사용노크또는/usr/xpg4/bin/awk.

관련 정보