xargs命令用法

xargs
  • xargs
  • 命令用法
    [root@localhost xiangjis]# cat -E text1
    11 apple$
    12 pear$
    13 banana$
    [root@localhost xiangjis]# cat text1 | xargs   \\此处为空格字符分隔
    11 apple 12 pear 13 banana
    空格分隔

    为了方便看清楚,上图匹配到的红色部分,即为空格
    [root@localhost xiangjis]# cat text1 | xargs -t   \\默认的执行命令为echo,分隔符为空格,这里用到了-t选项,后边还会有演示
    echo 11 apple 12 pear 13 banana
    11 apple 12 pear 13 banana
    [root@localhost xiangjis]# echo aaa@bbb@ccc | xargs
    aaa@bbb@ccc
    [root@localhost xiangjis]# echo aaa@bbb@ccc | xargs -d @   \\指定分隔符为@
    aaa bbb ccc
    [root@localhost xiangjis]#
    [root@localhost xiangjis]# xargs < text1   \\以上的参数都通过管道符传递的标准输出,这个是来自标准输入
    11 apple 12 pear 13 banana
    [root@localhost xiangjis]# xargs -a text1   \\指定参数来自文件
    11 apple 12 pear 13 banana
    [root@localhost xiangjis]# ls text* | cat   \\管道符将ls运行的标准输入当作标准输入传给cat运行
    text1
    text2
    text3
    [root@localhost xiangjis]# ls text* | xargs -p cat   \\ls运行的标准输出通过xargs运行后,被当作参数传给cat运行
    cat text1 text2 text3 ?...yes
    11 apple
    12 pear
    13 banana
    21 apple
    22 pear
    23 banana
    31 apple
    32 pear
    33 banana
以上两个标准输出对比下,唯一的区别是是否通过xargs命令运行,通过xargs运行后,cat输出的结果是文件的内容,而前者仅为文件的名字。前者cat 是将管道前命令的标准输出作为标准输入运行,后者cat将前者的标准输出作为参数运行,而这都是xargs的功劳。

[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' '\0'   \\tr将文件名之间的换行符转换成空字符
text1text 11text2text3
[root@localhost xiangjis]# ls text* | tr '\n' '\0' | 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]# find -name 'text*' -print0   \\find -print0,改变输出的分割符为空字符
./text1./text2./text3./text 11
[root@localhost xiangjis]# find -name 'text*' -print0 | xargs -0 -t 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]# ls text* | xargs -t -I [] grep apple []   \\解决方案四(自创的),这里用到的主要是-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]# find -name 'text*' -exec grep apple {} \;   \\解决方案四,用find 的-exec,这个就不多说了,本次主要说用xargs的解决方案
11 apple
21 apple
31 apple
11 apple

  • 总结
  1. 最后也可以用find的-exec参数来完成处理动作,但其支持的参数长度是有限的;所以find经常和xargs结合使用。

  2. 既然说到了find,在这里说下其-exec命令的用法,如下:

    必须使用 {} 标记文件名在命令中的位置。它不是自动添加在末尾的
    必须使用转义后的分号终止该命令,比如 ;、';' 或 ";" 都行
    该命令对每个输入文件执行一次

  3. 本次演示很多地方只用到了管道符,有些地方到了管道符和xargs;大家也看到其运行的结果是截然不同的,下面就是两者的主要区别:

    管道是实现“将前面的标准输出作为后面的标准输入”
    xargs是实现“将标准输入作为命令的参数”

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容