Linux xarges

对于管道|之后的一部分命令可以用stdin进行输入,如:

cat a | grep test

但有些命令只能用参数形式,就要使用xargs了,xargs可以将stdin转化为参数,类似于find命令中的-exec选项。
xargs也可以将单行或多行文本进行重新格式化。
下面示例是将多行输入处理为单行输出:

[student@myhost ~]$ cat a
space: 
tab:	
[student@myhost ~]$ cat a | xargs
space: tab:

通过以上命令我们知道了通道符后直接跟xargs可以将多行变为单行。
通过xargs的-n选项可以让单行变为多行,-n后跟的数字为每行的参数数量,以IFS(默认空格)为分隔符:

[student@myhost ~]$ cat a
1 2 3 4 5 6 7 8
[student@myhost ~]$ cat a | xargs -n 3
1 2 3
4 5 6
7 8

我们也可以自定义分隔符,使用-d选项确定分隔符:

[student@myhost ~]$ echo "1a2a3a4a5" | xargs -d a -n 2
1 2
3 4
5

我们可以用xargs给命令输入参数:

[student@myhost ~]$ cat a                #a为要执行的文件
echo $*#
[student@myhost ~]$ bash a 1
1#
[student@myhost ~]$ bash a 1 2 3
1 2 3#
[student@myhost ~]$ cat args             #xargs文件内容为要输入的参数
1 2 3
[student@myhost ~]$ cat args | xargs -n 1 bash a
1#
2#
3#
[student@myhost ~]$ cat args | xargs -n 2 bash a
1 2#
3#
[student@myhost ~]$ cat args | xargs -n 3 bash a
1 2 3#

当我们需要以下形式的命令参数时:

 bash a -p arg1 -o

以上命令只有arg1可变,我们可以用xargs命令的-I(大写i)选项:

[student@myhost ~]$ cat args | xargs -I {} bash a -p {} -o
-p 1 2 3 -o#

我们发现命令只替换到了{}中。
在日常工作中有些常见的与find命令一起的错误用法如:

find . -type f -name "*.txt" | xargs rm -f

以上命令删除使用find查找出来的文件,但如果文件名中有空格就有可能误删文件。我们可以这样改进它:

find . -type f -name "*.txt" -print0 | xargs -0 rm -f

以上命令中find的-print0选项含义为使用\0作为两个文件的分隔符,xargs的-0选项是将\0作为xargs命令读取的分隔符,这样就不会误删了。
统计c程序文件的LOC:

[student@myhost ~]$ find . -name "*.c" -type f -print0 | xargs -0 wc -l
 1 ./b.c
 1 ./a.c
 2 总用量

我们知道xargs不能给提供一个以上的命令提供参数,但通过while和子Shell就可以完成:

 cat b.c | (while read args; do echo $args;done )
 相当于
 cat b.c | xargs -I {} echo {}

以上命令中,while循环里可以执行多个命令,从而可以给多个命令提供同一参数。

posted @   epiphanyy  阅读(89)  评论(0编辑  收藏  举报  
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示