次のようなファイルがあります。
abcdef
123
ghiflk
234
sfhskdhf
483
文字列を検索したいのですが、出力に次の行(および/または前の行)も含める必要があります。
たとえば、
grep "bcd" myfile
Output:
abcdef
123
または前の行を表示します。
grep "ifl" myfile
Output:
123
ghiflk
数日間オンラインで解決策を見つけようとしましたが、見つからないようです。
答え1
GNUおよびBSDユーティリティには、次の行に一致するオプションと前の行に一致するオプションがgrep
あります。したがって、次のことができます。-A
-B
$ grep -A 1 bcd myfile
abcdef
123
ゲームの終わりにこの行を見せてください。
$ grep -B 1 ifl myfile
123
ghiflk
試合前のラインを示しています。最後に、-C
次を使用して一致の前後にN行を表示できます。
$ grep -C 1 ifl myfile
123
ghiflk
234
使用しているバージョンがこの機能をサポートしていない場合は、grep
いつでも別の方法を試してみてください。
grep
POSIX、sed
オプション、およびシェルの使用:n=$(grep -n bcd foo | cut -d':' -f1); sed -n "${n},$((n + 1))p" myfile
AWKを使う
awk '/bcd/ {print; getline; print}' myfile
もっとあります。
答え2
Steven Dが述べたオプションに加えて、GNU grepは、一致する行の前後に印刷する行数を指定する-nオプションの(非文書化)引数を受け入れます。もちろん、-n を使用すると行番号がオンになりますので、行番号が不要な場合は、-A オプションと -B オプションの方が良いでしょう。
たとえば、grep -n1 pattern
次のように動作します。grep -n -A1 -B1 pattern
don_crisstiがコメントで述べたように、これはいいえ実際には、このオプションの文書化されていないパラメータです-n
。-NUM
(ここでNUM
整数)は実際にoptionの同義語-C NUM
なので-nNUM
実際の略語です-n -C NUM
。