xargs命令用法

xargs命令用法,第1张

[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命令​


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/23571.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-02-16
下一篇2023-02-16

发表评论

登录后才能评论

评论列表(0条)

    保存