次のコマンドを使用して複数のファイルを再帰的に検索し、各ファイルで文字列が見つかった行番号を見つけました。
grep -nr "the_string" /media/slowly/DATA/lots_of_files > output.txt
出力は次のとおりです。
/media/slowly/DATA/lots_of_files/lots_of_files/file_3.txt:3:the_string
/media/slowly/DATA/lots_of_files/lots_of_files/file_7.txt:6:the_string is in this sentence.
/media/slowly/DATA/lots_of_files/lots_of_files/file_7.txt:9:the_string is in this sentence too.
上記のように、出力にはファイル名、行番号、および行のすべてのテキスト(文字列を含む)が含まれます。
また、以下を使用して、文字列を含むファイルの特定の行のみを印刷する方法もわかりました。
sed '3!d' /media/slowly/DATA/lots_of_files/lots_of_files/file_3.txt > print.txt
sed '6!d' /media/slowly/DATA/lots_of_files/lots_of_files/file_7.txt >> print.txt
sed '9!d' /media/slowly/DATA/lots_of_files/lots_of_files/file_7.txt >> print.txt
行番号とファイル名を読み、手動で上記のコマンドを生成しました。
これが私の問題です。
Q1a
これらの2つのステップを1つのコマンドにまとめる方法はありますか?行番号とファイル名をsedに関連付け、その行を印刷しようとしています。 grep出力が生成される順序に関する質問があります。
第1四半期
上記と同じですが、文字列を含む行の前後2行を印刷します(合計5行)?私は行番号とファイル名をsedに関連付けて、必要なすべての行を何とか印刷するつもりです。
とても感謝しています。
ベストアンサー1
質問を正しく理解したら、grepコマンドを使用してこれを実行できます。
Q1aの場合、grep
出力で抑制されたファイル名を使用できます-h
。たとえば、次のようになります。
grep -hnr "the_string" /media/slowly/DATA/lots_of_files > output.txt
Q1bの場合、出力grep
には使用と一致する行の前後に行を含めることができます-A
。-B
たとえば、次のようになります。
grep -hnr -A2 -B2 "the_string" /media/slowly/DATA/lots_of_files > output.txt
出力には一致の間に区切り文字が含まれており、それを使用して表示しないことがあります--no-group-separator
。たとえば、次のようになります。
grep -hnr -A2 -B2 --no-group-separator "the_string" /media/slowly/DATA/lots_of_files > output.txt
出力は、一致行(:
)とコンテキスト行(-
)に異なる区切り文字を使用します。