次のファイルがあります。
line1
line2
line3
line4
line5
line6
line7
line5
line2
line1
との間のデータを取得したいですline5
。私はそれを使用しましたawk '/line1/,/line5/' myfile
。予想される出力は次のとおりです。
line1
line2
line3
line4
line5
しかし、awkは最後の試合まで読みますline5
。私はawkが最後の試合ではなく、最初の試合で停止したいと思います。
答え1
問題を再現できません。 awk *は私が期待どおりに行います。最初の出現の間からline1
最初の出現までのすべての行を印刷しますline5
。
$ awk '/line1/,/line5/' file
line1
line2
line3
line4
line5
line5
ファイルの5行目の文字列に印刷されない隠し文字がありますか?これがawk
一致しない理由を説明します。
そのコマンドを実行して再確認できますsed
。
$ sed -n '/line1/,/line5/p' file
line1
line2
line3
line4
line5
すべての行を印刷しない(デフォルトの動作)を示しますが、最初の出現から最初の出現までのすべての-n
行を印刷するように指示します。sed
/line1/,/line5/p
line1
line5
ただ印刷したい場合最初パターンに一致する行で始まりline1
、一致する行で終わる行セットを作成するには、line5
次のようにします。
sed -n '/line1/,$p;/line5/q' file
*gawk
GNU実装を使用して確認しました(Kusalanandaはこれがawk
OpenBSDでもawk
正しいmawk
ことをすることを確認しました)。
答え2
以下を使用できますawk
。
awk '/line1/{prnt=1} prnt{print} /line5/{exit}' infile
line1
次の最初の行が一致するまで、一致する行を印刷してline5
すぐに終了します。
答え3
awk '/foo/,/bar/'
印刷みんなfoo
一致する行で始まり、次の一致する行(または同等の行の反対側と同じ行)で終わるsed
ファイルの一部bar
です(正規表現はline1
includeを含む行とも一致します)。line1anything
line10
似合いたい場合最初line1
一致する行で始まり、次の一致する行(または同じ行)で終わるセクションの場合は、次のことがline5
できます。
sed '/line1/,$!d;/line5/q' < file
line5
(最初の一致行の後に一致する行がない場合は、その行からファイルの終わりまでline1
印刷されます。パターンは次のようになります。line1
sed
基本的な正規表現ですが、awk
これは拡張式です)。