如果找到字符串则打印文件名

如果找到字符串则打印文件名

我有四个文件,分别是 - file1.txttest2.txtfile23.txttact24.txt以及要在这些文件中搜索的单词/字符串。如果在文件之一中找到单词,则打印文件名。

例子:

单词 -cat

在文件中搜索cat-file1.txt test2.txt file23.txt tact24.txt

假设猫被发现test2.txt然后只打印test2

awk这可以通过/sed命令在一行中完成吗?

我正在尝试下面 - 但无法得到我所期望的

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字符串而不是正则表达式。

如果您提供的文件名grepawk文件名不存在,它将报告错误。您可能希望看到这些错误(因为它们表明出现了问题),也可能不想看到。如果您不想看到它们,请将它们重定向到/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

相关内容