文字列が見つかるとファイル名を印刷する[閉じる]

文字列が見つかるとファイル名を印刷する[閉じる]

file1.txt-test2.txtfile23.txtという4つのファイルがあり、tact24.txtこのファイルから単語/文字列を検索したいと思います。ファイルのいずれかで単語が見つかった場合は、ファイル名を印刷します。

例:

単語 -cat

ファイルから検索cat-file1.txt test2.txt file23.txt tact24.txt

猫が見つかったと仮定してtest2.txt印刷するだけです。test2

awksed/ commandを介して1行でこれを実行できますか?

以下を試していますが、期待した結果は得られません。

grep cat file1.txt test2.txt file23.txt tact24.txt
file1.txt:cat
grep: test2.txt: No such file or directory
grep: file23.txt: No such file or directory
grep: tact24.txt: No such file or directory

grep cat file1.txt test2.txt file23.txt tact24.txt|grep -v "grep"
file1.txt:cat
grep: test2.txt: No such file or directory
grep: file23.txt: No such file or directory
grep: tact24.txt: No such file or directory

答え1

指定された文字列を含むファイルのファイル名を印刷します(ファイル名のサフィックスがある場合)。

awk '!found[FILENAME]++ && /string/ { fname = FILENAME; sub("\\.[^/]*$", "", fname); print fname }' file1.txt test2.txt file23.txt tact24.txt

これは現在のファイルのすべての行で文字列を検出しstring(ここでは正規表現として使用されるため、特殊文字をエスケープする必要があります)、そのファイルに一致するものが見つからない場合は、ファイル名のサフィックスを持たないファイル名が印刷されます。ファイル名のサフィックスは次のとおりです。最初ファイル名のドット。私がコマンドを書いた方法は、sub()コマンドラインに提供されている場合はファイルのディレクトリパスを保持します。

ファイルのパス名を出力するには、次のようにします。

grep -lF 'string' file1.txt test2.txt file23.txt tact24.txt

このオプションは一致を含むファイルのパス名のみを-l出力し、正規表現ではなく文字列として扱われます。grep-Fstring

指定したファイル名が存在する場合、またはgrepファイルawk名が存在しない場合は、エラーが報告されます。問題を示すため、これらのエラーを確認したい場合もあれば、そうでない場合もあります。見たくない場合は、次にリダイレクトしてください/dev/null

grep -lF 'string' file1.txt test2.txt file23.txt tact24.txt 2>/dev/null

2>「標準エラーストリームを次の場所にリダイレクト」を意味します。

/dev/nullgrepエラーストリームを次にリダイレクトする代わりに、次のオプションを使用することを選択できます-s

grep -lsF 'string' file1.txt test2.txt file23.txt tact24.txt

関連情報