たとえば、次のファイルから:
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。