xargs:将输入数据重新格式化后输出

xiaohai 2021-05-05 16:55:12 2069人围观 标签: Linux 
简介xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。能将标准输出或管道的数据转换成xargs命令后其他命令的命令参数。   xargs也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。   xargs的默认命令是echo,空格是默认定界符。

说明

  xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。能将标准输出或管道的数据转换成xargs命令后其他命令的命令参数。
  xargs也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。
  xargs的默认命令是echo,空格是默认定界符。

格式

  xargs [option]

参数说明:
  • -n:指定每行显示的数量
  • -d:自定义分隔符
  • -i:以{}代替前面的结果,这个使用最多
  • -I:自定义一个符号来代替前面的结果,而不用-i的{}来代替
  • -0:用null代替空格作为分隔符,配合find命令的-print0来一起使用,这个需要解决文件名中有空格

示例

多行文本边单行文本
[root@localhost test]# vim test.txt
[root@localhost test]# cat test.txt 
a b c d e
f g h i j
k
l
m n o p
[root@localhost test]# cat test.txt | xargs #使用管道
a b c d e f g h i j k l m n o p
[root@localhost test]# xargs < test.txt  #直接从文件从读取
a b c d e f g h i j k l m n o p

使用-n来指定每行显示的个数(默认以空格分隔)
[root@localhost test]# cat test.txt | xargs -n 3
a b c
d e f
g h i
j k l
m n o
p
[root@localhost test]# xargs -n 3 < test.txt 
a b c
d e f
g h i
j k l
m n o
p


使用-d来指定分隔符
[root@localhost test]# echo "php|python|go|java"
php|python|go|java
[root@localhost test]# echo "php|python|go|java"|xargs -d "|"
php python go java

[root@localhost test]# echo "php|python|go|java"|xargs -d "|" -n 1 #也是将单行变成多行
php
python
go
java

使用-i参数
[root@localhost test]# find . -name "test*.txt"|xargs -i mv {} dir1/
[root@localhost test]# ll
total 4
drwxr-xr-x. 2 root root 4096 May  6 02:32 dir1
[root@localhost test]# ls dir1/
test01.txt  test02.txt  test03.txt  test04.txt  test05.txt  test06.txt  test07.txt  test08.txt  test09.txt  test10.txt  test.txt

-I参数的使用
[root@localhost test]# find dir1/ -name "test*.txt"|xargs -I [] mv [] .
[root@localhost test]# ls
dir1  test01.txt  test02.txt  test03.txt  test04.txt  test05.txt  test06.txt  test07.txt  test08.txt  test09.txt  test10.txt  test.txt
[root@localhost test]# ls dir1/
[root@localhost test]# 


-0参数的使用
[root@localhost test]# touch test\ new.txt
[root@localhost test]# find . -name "test*.txt"|xargs rm
rm: cannot remove ‘./test’: No such file or directory
rm: cannot remove ‘new.txt’: No such file or directory
必须使用下面的命令才有用
[root@localhost test]# find . -name "test*.txt" -print0|xargs -0 rm