[root@localhost xiangjis]# ls text* | xargs -p cat
cat text1 text2 text3 ?...no
[root@localhost xiangjis]#
[root@localhost xiangjis]# ls text* | xargs -p cat
cat text1 text2 text3 ?...no
[root@localhost xiangjis]# ls text* | xargs -p -n 1 cat \\每次运行的参数数量为1个,默认按照空白字符分割每个命令参数
cat text1 ?...yes
11 apple
12 pear
13 banana
cat text2 ?...no
cat text3 ?...yes
31 apple
32 pear
33 banana
[root@localhost xiangjis]# ls text* | xargs -p -n 2 cat \\每次运行两个参数,因为一共就三个参数,最后运行一个参数
cat text1 text2 ?...yes
11 apple
12 pear
13 banana
21 apple
22 pear
23 banana
cat text3 ?...yes
31 apple
32 pear
33 banana
[root@localhost xiangjis]# ls text* | xargs -p -E text2 cat \\只运行text2之前的参数
cat text1 ?...yes
11 apple
12 pear
13 banana
[root@localhost xiangjis]# ls text* | xargs -p -E text3 cat
cat text1 text2 ?...yes
11 apple
12 pear
13 banana
21 apple
22 pear
23 banana
[root@localhost xiangjis]# ls text* | xargs -t -E text2 cat
cat text1
11 apple
12 pear
13 banana
[root@localhost xiangjis]# ls text* | xargs -t -E text3 cat
cat text1 text2
11 apple
12 pear
13 banana
21 apple
22 pear
23 banana
[root@localhost xiangjis]# cat text1 | xargs
11 apple 12 pear 13 banana
[root@localhost xiangjis]# cat text1 | xargs -n1
11
apple
12
pear
13
banana
[root@localhost xiangjis]# cat text1 | xargs -n2 -t \\每次运行两个参数
echo 11 apple
11 apple
echo 12 pear
12 pear
echo 13 banana
13 banana
[root@localhost xiangjis]# cat text1 | xargs -L2 -t \\将行当作参数,并设定一行两个参数
echo 11 apple 12 pear
11 apple 12 pear
echo 13 banana
13 banana
[root@localhost xiangjis]# pwd
/tmp/mytest/xiangjis
[root@localhost xiangjis]# ls text*
text1 text2 text3
[root@localhost xiangjis]# ls text* | xargs -i -t cp {} .. \-i参数,指定默认替代符为{},该参数已渐渐被-I(大写)取代
cp text1 ..
cp text2 ..
cp text3 ..
[root@localhost xiangjis]# ls ../text*
../text1 ../text2 ../text3
[root@localhost xiangjis]# ls ../text* | xargs -I [] -t rm [] \-I参数,指定[]为替换符
rm ../text1
rm ../text2
rm ../text3
[root@localhost xiangjis]# ls ../text*
ls: 无法访问../text*: 没有那个文件或目录
[root@localhost xiangjis]# xargs -t -I x echo "(x)" <text1 \-I参数,指定x为替换符
echo (11 apple)
(11 apple)
echo (12 pear)
(12 pear)
echo (13 banana)
(13 banana)
[root@localhost xiangjis]# cp text1 'text 11' \\创建文件名包含空白字符的文件(此处为空格字符)
[root@localhost xiangjis]# ll text*
-rw-r--r--. 1 root root 27 9月 10 22:11 text1
-rw-r--r--. 1 root root 27 9月 12 07:57 text 11
-rw-r--r--. 1 root root 27 9月 10 22:11 text2
-rw-r--r--. 1 root root 27 9月 10 22:11 text3
[root@localhost xiangjis]# ls text* | xargs -t grep apple \\xargs默认的分割符为空白字符,所以文件text 11,被认为为两个文件text和11,而这两个文件是不存在的,所以报错
grep apple text1 text 11 text2 text3
text1:11 apple
grep: text: 没有那个文件或目录
grep: 11: 没有那个文件或目录
text2:21 apple
text3:31 apple
[root@localhost xiangjis]# ls --quoting-style=escape text * \\通过此选项对文件名进行转义
text1 text\ 11 text2 text3
[root@localhost xiangjis]# ls --quoting-style=shell text* \\通过此选项对文件名加上引号
text1 'text 11' text2 text3
[root@localhost xiangjis]# ls --quoting-style=shell text* | xargs -t grep apple \\解决方案一
grep apple text1 text 11 text2 text3
text1:11 apple
text 11:11 apple
text2:21 apple
text3:31 apple
[root@localhost xiangjis]# ls --quoting-style=escape text* | xargs -t grep apple
grep apple text1 text 11 text2 text3
text1:11 apple
text 11:11 apple
text2:21 apple
text3:31 apple
[root@localhost xiangjis]# ls text* | tr '\n' ' ls text* | tr '\n' ' find -name 'text*' -print0' | xargs -0 -t grep apple' \\tr将文件名之间的换行符转换成空字符
text1text 11text2text3
[root@localhost xiangjis]# find -name 'text*' -print0 | xargs -0 -t grep apple \\解决方案二,此处运用了xargs -0选项
grep apple text1 text 11 text2 text3
text1:11 apple
text 11:11 apple
text2:21 apple
text3:31 apple
[root@localhost xiangjis]# ls text* | xargs -t -I [] grep apple [] \\find -print0,改变输出的分割符为空字符
./text1./text2./text3./text 11
[root@localhost xiangjis]# find -name 'text*' -exec grep apple {} \ \\解决方案三,此处运用了xargs -0选项
grep apple ./text1 ./text2 ./text3 ./text 11
./text1:11 apple
./text2:21 apple
./text3:31 apple
./text 11:11 apple
[root@localhost xiangjis]# 很多命令不支持管道来传递参数 \\解决方案四(自创的),这里用到的主要是-I参数,因为其将行当作参数运行,而非空白字符为分隔符,指定[]为替换字符,指定grep运行其的位置也很关键,否则grep命令运行会报错
grep apple text1
11 apple
grep apple text 11
11 apple
grep apple text2
21 apple
grep apple text3
31 apple
[root@localhost xiangjis]# grep不能从gz文件中查找内容 \\解决方案四,用find 的-exec,这个就不多说了,本次主要说用xargs的解决方案
11 apple
21 apple
31 apple
11 apple
xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具,它能够捕获一个命令的输出,然后传递给另外一个命令。之所以会用到这个命令,关键是由于 zgrep ,而日常工作中就有这个需要,所以就有了 xargs 命令。
我们经常会用grep命令在文件中查找需要的内容,比如现在一个文件夹里面有9个文件,有三种格式txt, csv和gz压缩文件。
123里面存的内容都一样为
456里面存的内容也一样为
789里面存的都是
如果我现在要从所有的文件里面找“apple”
我会得到下面的结果,你会发现 第一步找到名字中包含123的文件
第二步查找“apple” 这个命令可以解决这个问题,这样就不需要先解压然后再去查找了
会得到如下结果,显示了所有文件格式中找到的“apple”,并且显示了匹配的行号
如果只想在符合某种特征的文件中找你感兴趣的内容呢?比如在文件名中包含123的文件中查找“apple”。这时候就需要管道了,你需要先找到这样的文件然后再从中找“apple”
很多命令不支持管道来传递参数。
会得到文件名中包含123的所有文件
xargs
然后我们再来从中找“apple”,你会发现下面这条命令不work,你啥都得不到
这就是我们开篇提到的, zgrep 这个时候 就派上用场了
同时用上 ,这样gz文件也一起找了
那么,如果我们想从某一种特定格式的文件中(比如csv文件)找特定的内容该怎么做呢?大家应该能触类旁通,举一反三了吧!
Linux xargs grep zgrep命令
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)