
次のようなファイルがあります:
dn: ダナン
cn: ダニアン
cn: ダニアン1
dn: ダニアン2
cn: ダニアン2
dn: ダニアン3
cn: danian3
cn: danian4
私がやりたいのは、パターン「dn:」をgrepして次の2行だけを印刷することだけですが、grep -A 2 "dn:"を実行すると、結果にはファイル内のすべてのものが表示されます。次の1行ではなく、次の2行を印刷したいだけです。
答え1
これはうまくいくかもしれません:
$ awk -v RS="dn: " -v FS="\n" -v ORS="" 'NF>3 {print "dn:",$0}' input.txt
をレコード区切り文字として定義しますdn:
。1 つのレコード内のフィールドは、改行文字によって区切られます\n
。
で始まる行の後に 2 行続く場合dn:
、新しいレコードが で始まる前にdn:
、レコードに 4 つのフィールドの先頭に 3 回の "\n" が続くことになります。これが、レコードに 3 つ以上のフィールドがあるかどうかをチェックする理由です ( NF>3
)。その場合、レコード全体を出力しますが、 を先頭に追加する必要がありますdn:
。
NF>3
は、1 つのレコードに 2 行以上の後続行を持つすべてのレコードを検索することに注意してください。正確に 2 行を持つレコードのみが必要な場合は、 に変更しますNF==3
。
ブロックが空白行で区切られている場合 (後のコメントの 1 つに見られるように)、代わりにこれを使用します。
$ awk -v RS="\n\n" -v FS="\n" -v ORS="\n\n" 'NF>2 {print $0}' input.txt
答え2
上記のコマンドを実行すると完璧に動作します。
awk -v RS="\n\n" -v FS="\n" -v ORS="\n\n" 'NF>2 {print $0}'
区切られたブロックは空白で、完璧に動作します。