次の内容を含むファイルがあります。
zdk
aaa
b12
cdn
dke
kdn
入力1:aaa
とcdn
出力1:
aaa
b12
cdn
入力2:zdk
とdke
出力2:
zdk
aaa
b12
cdn
dke
次のコマンドを使用してこれを達成できます。
grep -a aaa -A2 file # Output 1
grep -a aaa -A4 file # Output 2
ただし、ファイル内の末尾の文字列パターンがどこにあるかを正確に知ることはできません(ファイルには20000行があります)。
この目標をどのように達成できますか?
ベストアンサー1
grep
ここではあなたを助けることはできません。sed
スコープ式を使用すると、これをよりよく実行できます。
$ sed -n '/aaa/,/cdn/p' file
aaa
b12
cdn
$ sed -n '/zdk/,/dke/p' file
zdk
aaa
b12
cdn
dke
sed -n
明示的に要求された場合にのみ行が印刷されるように自動印刷を抑制します。/aaa/,/cdn/
これは範囲が発生したときに発生します。
これらの範囲式はでも使用できますawk
。次のように言えます。
awk '/zdk/,/dke/' file
sed -n '/^aaa$/,/^cdn$/p' file
もちろん、これらすべての条件は、1行が完全に含まれていることを確認し、aaa
他cdn
のものが含まれていないことを確認するなど、より限定的な正規表現に拡張できます。