ファイル内のパターンを検索し、そのパターンを見つけた後に5行を印刷したいと思います。
これを行うには、awk
を使用する必要があります。
例:
ファイルの内容:
.
.
.
.
####PATTERN#######
#Line1
#Line2
#Line3
#Line4
#Line5
.
.
.
ファイルを解析し、上記の行のみを印刷するにはどうすればよいですか? 「PATTERN」を含む行のNRを使用し、最大5まで増分し続け、プロセスの各行を印刷しますか。 Awkで他の効率的な方法があれば、教えてください。
AWKでそれを行う別の方法:
awk '/PATTERN/ {for(i=1; i<=5; i++) {getline; print}}' inputfile
sed
で:
sed -n '/PATTERN/{n;p;n;p;n;p;n;p;n;p}' inputfile
in GNU sed
:
sed -n '/PATTERN/,+7p' inputfile
または
sed -n '1{x;s/.*/####/;x};/PATTERN/{:a;n;p;x;s/.//;ta;q}' inputfile
#
文字はカウンターを表します。出力する行数よりも1つ少ない数を使用します。
awk '
{
if (lines > 0) {
print;
--lines;
}
}
/PATTERN/ {
lines = 5
}
' < input
これにより以下が得られます。
#Line1
#Line2
#Line3
#Line4
#Line5
_grep "PATTERN" search-file -A 5
_は、grepにチャンスを与えることに決めた場合にあなたのために仕事をします。
編集:awk
スクリプト内からsystem()
関数を使用してgrepを呼び出すこともできます。
awk
救助に!
パターン行で印刷する(合計6行)
$ awk '/^####PATTERN/{c=6} c&&c--' file
####PATTERN#######
#Line1
#Line2
#Line3
#Line4
#Line5
パターンをスキップして次の5行を印刷するには
$ awk 'c&&c--; /^####PATTERN/{c=5}' file
#Line1
#Line2
#Line3
#Line4
#Line5
編集:PATTERN
が出力の一部であってはならないことに気づきませんでした。
cat /etc/passwd | awk '{if(a-->0){print;next}} /qmaild/{a=5}'
または
cat /etc/passwd | awk ' found && NR-6 < a{print} /qmaild/{a=NR;found=1}'
私が思いつくことができる最短は:
cat /etc/passwd | awk 'a-->0;/qmaild/{a=5}'
aは0になる傾向があります。/ qmaild /はaを5に設定します:-)
クイック&ダーティソリューション:awk '/PATTERN/ {i=0} { if (i<=5) {print $0}; i+=1} BEGIN {i=6}'
Johnsywebのソリューションと同じように制限されていますが、異なるアプローチとGNU awk
の完全なRegExレコードセパレータを可能にする高度な機能を使用して、IMHOが非常にawk
-Hは:
awk -F\\\n '{NF=5}NR-1' RS="PATTERN[^\n]*." OFS=\\\n
したがって、読みやすい安定したソリューションが必要な場合は、デニスウィリアムソンの回答(その1つに対して+1)を使用しますが、このような行を見るときにawk
の美しさを単純に楽しむこともできます。