xargs
是一个将管道的输出作为后续执行命令的参数。 这是和管道的本质区别。 管道是将输出作为输入, xargs 是将输出作为参数。xargs后面必须有命令,默认是echo
理解 xargs 是将输出作为参数
echo --version | xargs bash
# <==>
bash --version
以上两条命令是等价的,都是产看bash的版本。 echo 输出的版本有 xargs 处理后变成后面的命令bash的参数。
默认的命令 echo
以下两个命令是等价的
#
# xargs 后面必须有个命令,有则用echo
echo "file.txt" | xargs
#<==>
echo "file.txt" | xargs echo
"作为输出的内容" 和 "作为参数"的示例
# 测试文件
echo "file content" > file.txt
#测试代码
# 【作为输出内容】输出 file.txt 不是文件内容,
echo "file.txt" | cat
echo "file.txt" | cat -
# 【作为参数】
echo "file.txt" | xargs cat
echo "file.txt" | xargs cat -
xargs 的示例
# 使用i参数 , 符号{} 作为 参数的替换符号。
find /etc -maxdepth 1 -name "*.conf" | xargs -i grep "hostname" -l {}
find /etc -maxdepth 1 -name "*.conf" -exec grep "hostname" -l {} \;
# 推荐使用大写的I,这样更灵活比如,可以指定用什么符号替换
# 过命令中有{}那就必须用I
find /etc -maxdepth 1 -name "*.conf" | xargs -I@ grep "hostname" -l @
# 默认把换行和空白一起处理, 1,2,3中间有空格,456没有
cat <<eof>a.txt
> 1 2 3
> 456
> eof
cat a.txt | xargs # 输出 1 2 3 456 四个参数
# 一行输出4个
echo "1 2 3 4 5 6 " | xargs -n4
1 2 3 4
5 6
# 使用4作为定界符
echo "1 2 3 4 5 6 " | xargs -d4