xargs 命令简单总结

回复 收藏

xargs 命令
其实linux 中有很多命令 可以通过 | 来传递参数的。
但是是对于cp,echo等命令,不识别从(终端中的)标准输入所获得的内容,
xargs从标准输入(stdin)中读取数据进行处理

  • 数据以空格进行分隔
  • 可以根据参数进行一次或多次处理,默认的处理命令是/bin/echo
  • 空行不进行处理,会被忽略
  • 遇到命令状态为255时,xargs会立刻停止,譬如发生错误时.

通常情况下,xargs从管道或者stdin中读取数据,但是它也能够从文件的输出中读取数据。xargs的默认命令是echo,这意味着通过管道传递给xargs的输入将会包含换行空白,不过通过xargs的处理,换行和空白将被空格取代。

1 .它可以将单行变为1行
cat test.txt
111
222
333
444
555
666
777
aaa
bbb
ccc
ddd
eee
fff
# cat test.txt |xargs
111 222 333 444 555 666 777 aaa bbb ccc ddd eee fff
当然也可以指定   分行用 -n   来分行, -n 3  一行 有两个数据
cat test.txt |xargs  -n 3
111 222 333
444 555 666
777 aaa bbb
ccc ddd eee
fff
2 当热 xargs  也可以从文件获取 数据  用 -a
xargs -a test.txt
111 222 333 444 555 666 777 aaa bbb ccc ddd eee fff

3 xargs  -0 (零) 这个选项,就是 当输入有特殊字符时,将其当作一般字符处理,比如""和空格,换行
echo "/aa/\n"|xargs
/aa/n
echo "/aa/\n"|xargs -0
/aa/\n

echo "// " | xargs
//
echo "// " | xargs  -0
//

此时 打印了两行.

4    -d  可以指定分割符   , 注意分隔符 只能含有一个字符,或者\ 开头的特殊字符
cat 2.txt
1111c222c333c444c
cat 2.txt |xargs -d 'c'
1111 222 333 444
在2.txt  加入一行
aaa$bbb$ccc$ddd
cat 2.txt |xargs -d '$'
1111c222c333c444c
aaa bbb ccc ddd

5 -p  选项 相当于 交互模式
   cat test.txt |xargs -p
/bin/echo 111 222 333 444 555 666 777 aaa bbb ccc ddd eee fff ?...y
111 222 333 444 555 666 777 aaa bbb ccc ddd eee fff

6  -E eof-str
: 指定结束标志为eof-str,xargs处理到这个标志就会停止
还以test 进行测试
cat test.txt |xargs -E '555'
111 222 333 444
当碰到 555 标志的时候,就停止了

7        -t   先打印命令,然后再执行
cat 1.txt
aaa bbb ccc ddd
cat 1.txt | xargs  -t
/bin/echo aaa bbb ccc ddd
aaa bbb ccc ddd

8 -I 命令
-I replace-str
: 将每行输入输入内容替换为replace-str
下面 举个例子看看。
这是在shell  中的 完整输出 。。
[root@biaogelinux ~]# cat 1.txt
aaa bbb ccc ddd
[root@biaogelinux ~]# cat 1.txt | xargs  -t -I {}  echo {} >> 1.txt
echo aaa bbb ccc ddd
[root@biaogelinux ~]# cat 1.txt
aaa bbb ccc ddd
aaa bbb ccc ddd
[root@biaogelinux ~]# cat 1.txt | xargs  -t -I {}  echo {} >> 1.txt
echo aaa bbb ccc ddd
echo aaa bbb ccc ddd
[root@biaogelinux ~]# cat 1.txt
aaa bbb ccc ddd
aaa bbb ccc ddd
aaa bbb ccc ddd
aaa bbb ccc ddd
[root@biaogelinux ~]# cat 1.txt | xargs  -t -I {}  echo {} >> 1.txt
echo aaa bbb ccc ddd
echo aaa bbb ccc ddd
echo aaa bbb ccc ddd
echo aaa bbb ccc ddd
[root@biaogelinux ~]# cat 1.txt
aaa bbb ccc ddd
aaa bbb ccc ddd
aaa bbb ccc ddd
aaa bbb ccc ddd
aaa bbb ccc ddd
aaa bbb ccc ddd
aaa bbb ccc ddd
aaa bbb ccc ddd

简单解释一下, cat 1.txt   用-I {}  替代 cat 的每一行的输出, 从定向到1.txt , -t 就是 打印命令
第一次  :aaa bbb ccc ddd     从定向到 1.txt   所以就有了两行了
第二次 :
aaa bbb ccc ddd
aaa bbb ccc ddd
追加重定向到  1.txt ,  因此 有4行了。
同理  下面是 8行, 16行,

当然 -I  {}   这个是可以 换成其他的东西,例如 []   可以测试一下:
注意: 不能换成 ()  , 还有要注意 两个东西要一直,就是 -I 后面跟的内容,应该和echo 后面跟的东西一样。  

cat 1.txt | xargs  -t -I []  echo [] >> 1.txt
echo aaa bbb ccc ddd
[root@biaogelinux ~]# cat 1.txt
aaa bbb ccc ddd
aaa bbb ccc ddd


下面来测试一下看看:
[root@biaogelinux ~]# cat 1.txt
aaa bbb ccc ddd
[root@biaogelinux ~]# cat 1.txt |xargs -I {} -t  echo [] >> 1.txt
echo []
[root@biaogelinux ~]# cat 1.txt
aaa bbb ccc ddd
[]

此时它把  echo []    echo  的语句 追加重定向到了1.txt.
因此 这样写是不行的。  我想也不会犯这样的错误.




cat 1.txt | xargs  -t -I {}  echo {} >> 1.txt



8   -i  命令
等同于  -I{}    ,这里就不多解释了,
cat 1.txt | xargs -t -i echo {} >> 1.txt
[root@biaogelinux ~]# cat 1.txt |xargs -i -t  echo {}  >> 1.txt
echo aaa bbb ccc ddd
[root@biaogelinux ~]# cat 1.txt |xargs -i -t  echo {}  >> 1.txt
echo aaa bbb ccc ddd
echo aaa bbb ccc ddd
[root@biaogelinux ~]# cat 1.txt
aaa bbb ccc ddd
aaa bbb ccc ddd
aaa bbb ccc ddd
aaa bbb ccc ddd

当然xargs  命令 还是要和find  结合使用,才会更加强大。之后我也会写find + xargs  。 当然如果你看到 本文有什么问题,欢迎批评指正

2016-09-10 11:10 举报
已邀请:
0

繁星逐月

赞同来自:

可以可以,好详细啊{:4_113:}

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: