前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >浅谈Linux中的xargs命令

浅谈Linux中的xargs命令

作者头像
大数据真好玩
发布2019-08-21 15:27:50
2K0
发布2019-08-21 15:27:50
举报
文章被收录于专栏:暴走大数据暴走大数据

在说xargs命令之前,先说两句Linux中的管道(pipe)。

管道负责单向连接前一个程序的标准输出与后一个程序的标准输入,其本质是一个共享文件。我们日常最常用到的管道是匿名管道,Shell中的管道符号为“|”。

有空会读读与管道有关的内核源码的,比如pipe()

管道用法举例:

  • 打印/usr/lib目录下的内容,按大小排序,并分页显示行号
ll -Sh /usr/lib | less -N
  • 取出历史登录信息中的用户名,排序、去重并计数
last | cut -d ' ' -f 1 | sort | uniq -c
  • 杀掉所有正在运行的redis-cli进程
kill -15 `ps aux | grep redis-cli | grep -v grep | awk '{print $2}'`
  • 杀掉所有正在运行的redis-cli进程
kill -15 `ps aux | grep redis-cli | grep -v grep | awk '{print $2}'`

那么xargs命令又和管道有什么关系呢?如果把上面的第三个例子换一种写法:

这说明kill命令没有接收到应有的参数。还有很多命令(比如最常见的mkdir、rm、cp等等等)都不会从标准输入读取内容,这时如果在管道符后加上xargs,再加上要执行的命令,那么前一个程序的标准输出就会作为后一个程序的参数,而不是标准输入了。

看官可以尝试执行以下两对命令,看看输出有什么不同,能够加深理解:

  • echo '--help' | catecho '--help' | xargs cat
  • 随便找一个Spring项目的代码目录,分别执行find . -name '*.java' | grep Implfind . -name '*.java' | xargs grep Impl

同样地,上面例子中的kill命令应该改写成:

ps aux | grep redis-cli | grep -v grep | awk '{print $2}' | xargs kill -15

xargs命令本身也有一些参数,使用方法很灵活,下面再举几个例子。

  • 自定义分隔符 xargs默认用IFS(inner field separator,即内部域分隔符,包含空格、制表符、换行符)分割上一个程序的标准输出。如果要用其他分隔符,可以用-d参数,例如:
~ echo '1,2,3,4,5' | xargs -d ',' echo
1 2 3 4 5

特别地,用-0(注意是数字0)参数可以指定NULL字符'\0'作为分隔符。

  • 分批传参 用-n参数可以规定每次传递多少个参数给后面的命令,它可以单用,也可以与-d配合使用,例如:
~ echo '1,2,3,4,5,6,7,8,9' | xargs -d ',' -n 4 echo
1 2 3 4
5 6 7 8
9
  • 指定终止符 用-E参数可以指定xargs在遇到哪个字符串时停止解析(不含该字符串)。-E不能与-d同用,例如:
~ echo 'cd pwd ls ps' | xargs -E 'ls' echo
cd pwd
  • 交互式执行 用-p参数就会在每次执行命令之前询问,输入y(yes)才会真正执行。如果只是想观察命令本身,可以用-t参数。例如:
~ echo '1,2,3,4,5,6,7,8,9' | xargs -d ',' -n 4 -t echo
echo 1 2 3 4
1 2 3 4
echo 5 6 7 8
5 6 7 8
echo 9
9
  • 指定替换参数位置 xargs接收的参数默认会分配到下一个命令的结尾,即追加。如果想要指定替换的参数位置,可以用-I或者-i参数。其中,-i固定用双大括号{}作为占位符,-I则可以自行指定其他符号作为占位符。这个东西很有用,例如:
# 计算表达式的值
~ echo '77' | xargs -I 'q' expr 2 \* q + 8
162

# 批量重命名目录下的文件
~ ls | xargs -i mv {} {}.bak

# 批量复制目录下的文件
~ find . -name "*.jar" | xargs -i cp {} /opt/cloudera/jars

mv、cp等命令对参数列表的长度有限制,如果按普通方法一次操作太多文件,会报“Argument list too long”错误。而xargs每次传参时是以默认128KB的批次进行,所以一切正常。批次大小还可以用-s参数自行指定。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据真好玩 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档