それぞれ次の内容を含むファイル1.txt
と2.txt
があるとしましょう。3.txt
foo1
Notes
foo2
bar
今私が配置した行を印刷したいと思います。後ろにパターンをNotes
ファイルの最後まで含めるか、foo
パターンbar
を含めます。これを達成するために、次のコマンドを実行します。
awk '/Notes/,/getline==0/ {if (/foo|bar/) {print}}' *txt
ただし、awk
この範囲は、2番目のファイルが処理されるとリセットされるようです。結果は次のとおりです(foo2
合計項目のみを表示する必要があります)。bar
foo2
bar
foo1
foo2
bar
foo1
foo2
bar
明らかに私がそうするなら:
for i in $(*txt); do awk '/Notes/,/getline==0/ {if (/foo|bar/) {print}}' $i; done
...すべてが問題ありませんが、もちろん、awk
各ファイルに対して新しいプロセスを開始したくないので、これは実際には解決策ではありません。
awk
私の質問は、この検索範囲を/Notes/,/NR==0/
マスク/グループ内のすべてのファイルに適用するにはどうすればよいですか?*txt
答え1
/getline==0/
検索模様 getline==0
、これは決して起こらないでしょう。
GNU awkがあればこれを行うことができます
gawk '/Notes/{notes=1} notes && /foo|bar/ {print} ENDFILE{notes=0}'
そうでなければ(もっと慣用的に)
awk 'FNR==1{notes=0} /Notes/{notes=1} notes && /foo|bar/'