@エドモートン:私はここであなたに同意しません。sed
複数行のgrepを実行するためのエレガントな方法を考え出すには、非常に便利で簡単であることがわかりました(パターンの概念を理解し、バッファーを保持すると)。
たとえば、ホスト名と各ホストに関する情報が含まれているテキストファイルを見てみましょう。その間に、私が気にしない多くのがらくたがあります。
Host: foo1
some junk, doesnt matter
some junk, doesnt matter
Info: about foo1 that I really care about!!
some junk, doesnt matter
some junk, doesnt matter
Info: a second line about foo1 that I really care about!!
some junk, doesnt matter
some junk, doesnt matter
Host: foo2
some junk, doesnt matter
Info: about foo2 that I really care about!!
some junk, doesnt matter
some junk, doesnt matter
私にとって、ホスト名と対応するinfo
行を含む行を取得するawkスクリプトは、sedで実行できるよりも少し時間がかかります。
sed -n '/Host:/{h}; /Info/{x;p;x;p;}' myfile.txt
出力は次のようになります。
Host: foo1
Info: about foo1 that I really care about!!
Host: foo1
Info: a second line about foo1 that I really care about!!
Host: foo2
Info: about foo2 that I really care about!!
(Host: foo1
出力に2回表示されることに注意してください。)
説明:
-n
明示的に印刷されない限り、出力を無効にします
- 最初の一致、
Host:
行を見つけてホールドバッファに入れます(h)
- 2番目の一致は、次のInfo:行を検索しますが、最初にパターンバッファー内の現在の行をホールドバッファーと
Host:
交換(x)し、その行を出力(p)してから、再交換(x)してInfo:行を出力(p)します。
はい、これは単純な例ですが、これは単純なsedワンライナーですぐに対処された一般的な問題だと思います。特定の予測可能なシーケンスに依存できないタスクなど、はるかに複雑なタスクの場合は、awkの方が適している場合があります。
echo $'1\n2\n3\n4' | sed -n '1~2h;2~2{p;x;p}'