web-dev-qa-db-ja.com

awkを使用してファイル内のパターンの後に5つの連続した行を印刷する方法

ファイル内のパターンを検索し、そのパターンを見つけた後に5行を印刷したいと思います。

これを行うには、awkを使用する必要があります。

例:

ファイルの内容:

.
.
.
.
####PATTERN#######
#Line1
#Line2
#Line3
#Line4
#Line5
.
.
.

ファイルを解析し、上記の行のみを印刷するにはどうすればよいですか? 「PATTERN」を含む行のNRを使用し、最大5まで増分し続け、プロセスの各行を印刷しますか。 Awkで他の効率的な方法があれば、教えてください。

39
tomkaith13

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つ少ない数を使用します。

54
awk '
{ 
    if (lines > 0) {
        print;
        --lines;
    }
}

/PATTERN/ {
    lines = 5
}

' < input

これにより以下が得られます。

#Line1
#Line2
#Line3
#Line4
#Line5
14
Johnsyweb

_grep "PATTERN" search-file -A 5_は、grepにチャンスを与えることに決めた場合にあなたのために仕事をします。

編集:awkスクリプト内からsystem()関数を使用してgrepを呼び出すこともできます。

12
anubhava

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
8
karakfa

編集: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に設定します:-)

7
ninjalj

クイック&ダーティソリューション:awk '/PATTERN/ {i=0} { if (i<=5) {print $0}; i+=1} BEGIN {i=6}'

0
gelraen

Johnsywebのソリューションと同じように制限されていますが、異なるアプローチとGNU awkの完全なRegExレコードセパレータを可能にする高度な機能を使用して、IMHOが非常にawk-Hは:

awk -F\\\n '{NF=5}NR-1' RS="PATTERN[^\n]*." OFS=\\\n

したがって、読みやすい安定したソリューションが必要な場合は、デニスウィリアムソンの回答(その1つに対して+1)を使用しますが、このような行を見るときにawkの美しさを単純に楽しむこともできます。

0
mschilli