サブディレクトリ内のすべてのファイルの特定の文字列の下の5行をすべて印刷します。

サブディレクトリ内のすべてのファイルの特定の文字列の下の5行をすべて印刷します。

私は多くのサブディレクトリを持つディレクトリを持っていますが、すべて「name」ファイルを持っていて、各ファイル「name」の各文字列「str」の下に5行を印刷したいと思います。

答え1

"str"を含む行が見つかると、次の5行が印刷されます。 (これがあなたが望むものであることを願っています):

find . -type f -name name | xargs awk '/^str$/ {i=1; next;} \
                                           i>0 {print; if(i<5) i++; else i=0;}'

答え2

grepを使う

find -type f -name "name" -exec grep -F -h "str" -A5 {} +

その後、「name」という名前のすべてのファイルを検索し、文字列「str」を探す各ファイルに対してgrepを実行します。この-A5フラグを使用するには、grep各ゲームの後に5行を表示する必要があります。ファイル名が表示されないように-hします。grep

sedで

find -type f -name "name" -exec sed -n -s '/txt/,+5 p' {} +

ここも同じだ。sed -n行は印刷されません。ラインが/txt/,+5ブロック内にある場合にのみ出力が行われます。これは、「'txt'を含む行から始まる6行」を含むことを意味します。

一致する行がありません

どちらのソリューションも「txt」を含む行を印刷します。必要でない場合は、sed以下を使用して削除します。

find -type f -name "name" -exec sed -n -s '/txt/,+5 { /txt/ d; p }' {} + 

関連情報