예를 들어 다음 파일에서:
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.