複数の文字列をGrepして、文字列の1つに続く行数を表示します(他の文字列は表示しません)。

複数の文字列をGrepして、文字列の1つに続く行数を表示します(他の文字列は表示しません)。

ファイルから複数の文字列を検索し、特定の文字列を検索して、その後の5行も表示したいと思います。

cat file | grep -e 'string1' -e 'string2'

もちろん動作しますが、次のようなものを取得したいと思います。

cat file | grep -e 'string1' -e -A 5 'string2'

string1を含む行のみを表示し、string2を含む行とstring2の後の5行だけを表示し、string1の後の5行を表示しないようにするにはどうすればよいですか(-A 5オプションを使用すると仮定)。

編集:ちょうどawkで作業しました。

cat file | awk '/string1/{c=1}/string2/{c=5}{while(c-->0){print;getline}}'

答え1

awkコードについて

awk '/string1/ {if ( c <= 0 ) c = 1;} /string2/ {c=5} { if (c-- > 0) print; }' file
  • いいえcat ... | awk、awkはファイルを読み取ることができます。
  • テストを並べ替えました(string1がstring2の後に1行続くと、OPソリューションで印刷が中断されます)。

答え2

一度にすべて使用することはできませんgrep。 2つのインスタンスを使用する必要がありますgrep

grep 'string1' file; grep -A 5 'string2' file

最初の成功後に2回目の実行を実行するには:

grep 'string1' file && grep -A 5 'string2' file

答え3

解決策:

sed -n '/string2/,+4{p;b;};/string1/p' file

私も代わりにsed受け入れる~+

関連情報