我有四个文件,分别是 - file1.txt
、test2.txt
、file23.txt
和tact24.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
字符串而不是正则表达式。
如果您提供的文件名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