Linux xargs grep zgrep命令

2020-08-06 11:10:33 浏览数 (1)

xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具,它能够捕获一个命令的输出,然后传递给另外一个命令。之所以会用到这个命令,关键是由于很多命令不支持管道来传递参数,而日常工作中就有这个需要,所以就有了 xargs 命令。

我们经常会用grep命令在文件中查找需要的内容,比如现在一个文件夹里面有9个文件,有三种格式txt, csv和gz压缩文件。

123里面存的内容都一样为

456里面存的内容也一样为

789里面存的都是

如果我现在要从所有的文件里面找“apple”

代码语言:javascript复制
 grep "apple" *

我会得到下面的结果,你会发现grep不能从gz文件中查找内容

代码语言:javascript复制
123.csv:apple
123.txt:apple
456.csv:apple
456.txt:apple
789.csv:apple
789.txt:apple

zgrep这个命令可以解决这个问题,这样就不需要先解压然后再去查找了

代码语言:javascript复制
#-n 显示找到的行号
zgrep -n "apple" *

会得到如下结果,显示了所有文件格式中找到的“apple”,并且显示了匹配的行号

代码语言:javascript复制
123.csv:1:apple
123.txt:1:apple
123.txt.gz:1:apple
456.csv:6:apple
456.txt:6:apple
456.txt.gz:6:apple
789.csv:8:apple
789.txt:8:apple
789.txt.gz:8:apple

如果只想在符合某种特征的文件中找你感兴趣的内容呢?比如在文件名中包含123的文件中查找“apple”。这时候就需要管道了,你需要先找到这样的文件然后再从中找“apple”

第一步找到名字中包含123的文件

代码语言:javascript复制
find ./ -name "123*"

会得到文件名中包含123的所有文件

代码语言:javascript复制
./123.txt.gz
./123.txt
./123.csv

第二步查找“apple”

然后我们再来从中找“apple”,你会发现下面这条命令不work,你啥都得不到

代码语言:javascript复制
 find ./ -name "123*" | grep "apple"

这就是我们开篇提到的,很多命令不支持管道来传递参数。这个时候xargs就派上用场了

代码语言:javascript复制
find ./ -name "123*" | xargs zgrep -n "apple"

同时用上zgrep,这样gz文件也一起找了

代码语言:javascript复制
./123.txt.gz:1:apple
./123.txt:1:apple
./123.csv:1:apple

那么,如果我们想从某一种特定格式的文件中(比如csv文件)找特定的内容该怎么做呢?大家应该能触类旁通,举一反三了吧!

0 人点赞