file1.txt
-test2.txt
とfile23.txt
という4つのファイルがあり、tact24.txt
このファイルから単語/文字列を検索したいと思います。ファイルのいずれかで単語が見つかった場合は、ファイル名を印刷します。
例:
単語 -cat
ファイルから検索cat
-file1.txt
test2.txt
file23.txt
tact24.txt
猫が見つかったと仮定してtest2.txt
印刷するだけです。test2
awk
sed
/ 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
-F
string
指定したファイル名が存在する場合、またはgrep
ファイルawk
名が存在しない場合は、エラーが報告されます。問題を示すため、これらのエラーを確認したい場合もあれば、そうでない場合もあります。見たくない場合は、次にリダイレクトしてください/dev/null
。
grep -lF 'string' file1.txt test2.txt file23.txt tact24.txt 2>/dev/null
2>
「標準エラーストリームを次の場所にリダイレクト」を意味します。
/dev/null
grep
エラーストリームを次にリダイレクトする代わりに、次のオプションを使用することを選択できます-s
。
grep -lsF 'string' file1.txt test2.txt file23.txt tact24.txt