xargs - Linux里好用的工具

xargs

xargs原来意思是build and execute command lines frooom standarad input(stdin)
xargs把从stdin接受到的字串, 转成後面命令的参数, 来执行後面的命令.

为什麽讲这个命令呢?
之前介绍grep、sed、awk,
grep找到的内容可以给sed、awk直接读取
但若我是取出档名, 要给後两者读取其内容呢?
这时xargs可以帮忙处理

# 搜寻txt档案内容有it的, 显示其档名
grep -l 'it' *.txt                               
> aa.txt
> python.txt

# 透过xargs将档名当成sed的参数, 来执行sed
grep -l 'it' *.txt | xargs sed -n 's/it/ithome/p'
> baseurl=https://xxx/mysql-repo/yum/mysql-5.7-communithomey/el/$releasever/$basearch
> 13Th Ithome is my favorithomee active

转个思维表示;
系统内的日志也是能grep找出来含内容的档案, 再转给awk做格式转换制作表格後,
再输出到类似kibana等等的地方做储存展示.
也能是用grep转到执行自己写的程序, 将档名当成参数.

option介绍

xargs预设是用空格做完分隔符号, 也就是说,

echo "aa.txt python.txt" | xargs sed -n 's/it/ithome/p'
> baseurl=https://xxx/mysql-repo/yum/mysql-5.7-communithomey/el/$releasever/$basearch
> 13Th Ithome is my favorithomee active

xargs会将"aa.txt python.txt"按照空格切成aa.txt、python.txt,
传给sed当参数sed -n 's/it/ithome/p' aa.txt python.txt, 然後执行.

也能指定分隔符号, 透过-ddelimiter,

# 指定@为分隔符号
echo '11@22@33' | xargs -d '@' echo         
> 11 22 33

也能指定EOF符号-E, 表示读到EOF就不会再读取字串, 也不会去执行命令
ps 但无法跟上一个-d一起混用

# 指定22为EOF, 因此33就不被读取, 22是不被拿去echo给执行去
echo '11 22 33' | xargs -E '22'  echo       
> 11

透过-tverbose, 能把要执行的命令给输出出来, 并且执行该命令

# 能看到真正要执行的命令
grep -l 'it' *.txt | xargs -t sed -n 's/it/ithome/p'   
> sed -n s/it/ithome/p aa.txt python.txt 
> baseurl=https://xxx/mysql-repo/yum/mysql-5.7-communithomey/el/$releasever/$basearch
> 13Th Ithome is my favorithomee active

透过-pinteractive, 这命令就只是一个prompt, 询问是否要执行, 输入y/Y, 就真正执行该命令
通常会跟上一个-t搭配使用

grep -l 'it' *.txt | xargs -tp sed -n 's/it/ithome/p'
# 会显示命令并且等待用户输入,  这里我输入y
> sed -n s/it/ithome/p aa.txt python.txt ?...y

> baseurl=https://xxx/mysql-repo/yum/mysql-5.7-communithomey/el/$releasever/$basearch
> 13Th Ithome is my favorithomee active

玩一下之前学到的,做组合拳
先开一个新的terminal, 挂着让它跑

ping -i 1 8.8.8.8 

再开另一个terminal
然後透过ps找到这执行中的PID, 透过xargs传给kill执行

ps -ef | grep 'ping -i' | awk '{print $2}' | xargs -t  kill -9
> kill -9 242585 242668 
> kill: (242241): No such process

执行完, 原本持续在ping的process就会收到kill讯号而被kill.
这里用到之前的grep+awk

掌握这些基本也能, 做到说像是去redis找到key, 然後再去删除key

./redis-cli -h 127.0.0.1 -p 6381 -n 1 KEYS "ithome:*" | xargs ./redis-cli -h 127.0.0.1 -p 6381 -n 1 DEL

本日小结

很多组合的操作, 其实大多都能通过xargs中间转一手来处理.
因为不是每个工具都支持pipeline的使用,
有xargs就能让这些不支持的程序, 可以使用前一个命令完成之後的结果.
真的是个很方便的工具

----参考来源
鸟哥Linux私房菜 xargs


<<:  IT 铁人赛 k8s 入门30天 -- day17 Run automated tasks with cron jobs

>>:  【Day16-搜寻】茫茫文海当中找到那个对的词——文字处理利器之正规表达式在python的应用

Day 11 : psycopg2 操作

今天拉回 python 来介绍 psycopg2,这个套件可以跟 postgres 进行互动。我们依...

如何快速上手第三方套件

在现在这种讲求快速开发的开发模式,我们通常不太会自己将所有功能都自己硬刻出来,而是会去使用第三方的套...

Service Container

Service Container 是 Laravel 框架中相当重点的一个功能,主要是用来节省撰写...

[Day27] Vue3 E2E Testing: Cypress 实战之 Todo MVC (下)

前情提要 前两天,我们开始为 Vue.js • TodoMVC 攥写 E2E 测试,并分别在 Cyp...

Day17-TypeScript(TS)的继承(Inheritance)

今天要来介绍TypeScript(TS)的继承(Inheritance), 这项在TS之中也是相当重...