1. 前言
有时间我们需要查找文件,并不是根据文件名查找文件,而是查看每个文件里的内容是否包括某些关键字,然后把带有特定关键字内容的文件找出来。本文列举出常用的使用命令和案例,希望能给读者一些帮助。
2. Linux根据关键字查找文件内容的实用案例
Linux根据关键字查找文件内容的实用案例
在linux下如果要查找包含某个关键字的文件,如要在/root/目录下搜索带有关键字“zcwyou”的文件,在终端下运行命令:
在/root/目录下查找带有test关键字的文件
查找当前目录及其子目录下所有php文件中包含某关键字的文件,假设关键字为:keyword
在Linux的终端中,搜索当前目录和子目录中含有某关键字(假设关键字为zcwyou)的文件,命令如下:
查找目录/var/www/html/test/里,包含带关键字linuxrumen.com的文件并删除这些文件
查找当前目录下的所有文件中是否含有某个字符串,假设关键字为zcwyou
查找当前目录下的所有文件中是否含有某个字符串
查找当前目录下的所有文件中是否含有某个字符串(以关键字zcwyou为例),并且只打印出文件名
linux 查找某目录下包含关键字内容的文件
grep -r "{关键字}" {路径}
linux查找某目录下包含关键字内容的文件
例如:
在目录/zcwyou/test/里,找到带有关键字test文件
3. Linux使用重定向和过滤管道组合更精准查找文件内容
linux使用重定向和过滤管道组合更精准查找文件内容
对find,xargs,grep和管道的一些深入理解
相信大家都知道在目录中搜索含有固定字符串文件的命令:
利用find命令查找当前目录下,后缀名为py的文件,在这些文件里,查找带有关键字test的内容
如果我们把xargs删除,比如执行以下命令:
结果并不是自己所期望的。此命令只是找出文件名*.py有关键字test的情况,为何?
这里就需要大家熟悉xargs的工具,下面我们科普一下shell编程里的基础知识
3.1 参数与标准输入
这两个词我们在Linux命令中是很常见的。但是参数和标准输入其实是有区别的。我们日常使用的很多命令,例如ls -lah .中。l, a, h ,都是命令ls的参数。至于标准输入,可以说它某种流数据。而通常来讲标准输入的流数据来源就是我们的终端输入。在Linux命令中,有些命令可以接收标准输入,有些是不能的。像上面的ls,就是只能接收参数,不能接收标准输入。像cat命令或echo命令,这些是可以的。
怎么分辨一个命令可不可以接收标准输入?很简单,当你敲完命令回车后,终端会等待接收你的输入,例如当你在终端输入cat后,终端会等待你输入字符,当你输入一些字符后,然后按Ctrl-C发送终止符号。这时cat命令接收标准输入完毕,执行命令,也就是将刚才键入的内容输出的标准输出上(屏幕)。
3.2 管道
管道的作用是将前面命令的标准输出作为后面命令的标准输入。这里要注意,后面的命令接收的是标准输入,所以如果命令不支持接收标准输入,那么就不能直接使用管道,例如常用的ls命令,只能使用参数,而不能使用标准输入,所以[command] | ls是不能使用的。而命令如echo或cat就可以。那么肯定有方法来实现这些不能使用标准输入的命令与管道结合,这时候xargs便出场了。
3.3 xargs命令
xargs命令通俗来讲就是将标准输入转成各种格式化的参数,所以命令[command 1] | xargs [command 2]就是将command 1的标准输出结果,通过管道|变成xargs的标准输入,然后xargs再将此标准输入变成参数,传给[command 2]。这样一来,通过xargs命令,我们便可以在管道后面使用那些不接收标准输入的命令了。例如[command 1]|xargs ls,是不是很熟悉?
3.4 find与grep配合查找带有特定关键字文件内容
我们首先来查看grep手册。通过man grep命令。
grep searches the named input FILEs (or standard input if no files are named, or if a single hyphen-minus (-) is given as file name) for lines containing a match to the given PATTERN. By default, grep prints the matching lines
那么对于第一个命令find . -name '*.py' |grep test,是将前面命令的标准输出作为标准输入传给了grep test,那么grep是从这些标准输入寻找test字符,也就是文件名组成的字符流, 最终选择出的是这些文件名。
对于第二个命令find . -name '*.py' |xargs grep test,通过xargs,find得到的文件名成为了参数传给后面的grep,那么这时候这些文件名就是实实在在的文件标识,grep接收后会按正常的使用方式在各文件中搜寻字符串。
3.5 grep 参数
-a 不要忽略二进制数据。
-A 除了显示符合范本样式的那一行之外,并显示该行之后的内容。
-b 在显示符合范本样式的那一行之外,并显示该行之前的内容。
-c 计算符合范本样式的列数。
-C或- 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
-d 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。
-e 指定字符串作为查找文件内容的范本样式。
-E 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。
-f 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。
-F 将范本样式视为固定字符串的列表。
-G 将范本样式视为普通的表示法来使用。
-h 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
-H 在显示符合范本样式的那一列之前,标示该列的文件名称。
-i 忽略字符大小写的差别。
-l 列出文件内容符合指定的范本样式的文件名称。
-L 列出文件内容不符合指定的范本样式的文件名称。
-n 在显示符合范本样式的那一列之前,标示出该列的编号。
-q 不显示任何信息。
-R/-r 此参数的效果和指定“-d recurse”参数相同。
-s 不显示错误信息。
-v 反转查找。
-w 只显示全字符合的列。
-x 只显示全列符合的列。
-y 此参数效果跟“-i”相同。
-o 只输出文件中匹配到的部分。
4. 总结