Shell命令之xargs使用小结

常见用于管道的处理中,拿到前面的数据进行后续的处理;

xargs 以空白字符或换行作为分割,默认使用echo输出结果,且会忽略空白行,官方说明如下

xargs reads items from the standard input, delimited by blanks (which can be protected with double or single quotes or a backslash) or newlines, and executes the command (default is /bin/echo) one or more times with any initial-arguments followed by items read from standard input. Blank lines on the standard input are ignored.

I. 使用说明

1. 参数解释

-0

将特殊字符当做一般字符处理,简单来说,空白不被忽略掉,如下

IMAGE

-a file

文件作为数据源,等同于 cat xxx.txt | xargs

-n num

表示命令在执行的时候一次用的argument的个数

-p

操作具有可交互性,每次执行comand都交互式提示用户选择,当每次执行一个argument的时候询问一次用户

IMAGE

-t

表示先打印命令,然后再执行。

IMAGE

-I

替换,将前面的数据,一各一个的赋值给{},后面使用者可以用{}来表示前面接收的数据

如批量修改文件后缀名

IMAGE

-L

从标准输入一次读取num行送给Command命令 ,-l和-L功能一样

IMAGE

-d

默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符

如下图,将默认的分隔符换成$

IMAGE

2. 结合使用

xargs命令通常是与其他的命令配套结合使用,下面给出几个常见的使用case

a. 打印jvm堆栈信息

jvm应用的id存在pid_file中,需要进行堆栈分析时,一行命令即可

1
cat pid_file | xargs -I {} jstack {} | grep "VM Periodic Task Thread"

IMAGE

当然,如果需要关闭应用,也比较简单了

1
cat pid_file | xargs -I {} kill -9 {}

b. find查找

配合find命令进行查找匹配也比较常见了,如查找文件并打印内容

1
find ./ -name \*.bak -type f -print | xargs -t -I {} cat {}

IMAGE

另外一个常见的就是匹配文本的内容

1
find ./ -name \*.bak -type f -print | xargs -t -I {} grep a {} -n

IMAGE

II. 其他

1. 一灰灰Bloghttps://liuyueyi.github.io/hexblog

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

2. 声明

尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

3. 扫描关注

一灰灰blog

QrCode

知识星球

goals