1.命令作用
从标准输入构建和执行命令行(build and execute command lines from standard input)
2.命令语法
Usage: xargs OPTION... COMMAND INITIAL-ARGS...
2.1.语法解释
运行命令COMMAND,并传入参数INITIAL-ARGS以及从输入中读取的其他参数
3.参数详解
OPTION:
- 不带参数, 列转行
- -0, --null,项之间用空分隔,而不是空白(默认)
- -a, --arg-file=FILE,从FILE读取参数,而不是标准输入
- -d, --delimiter=CHARACTER,指定CHARACTER作为分隔符,而不是用空格分隔
- -E END,如果出现END指定的行,则停止执行(包括END指定的行)
- -e END, --eof=END,如果指定了END,则相当于-E END;否则,没有文件结束字符串
- --help,打印帮助信息并退出
- -I R,与--replace=R 相同(R 必须指定)
- -i,--replace=R,将初始参数中的R替换为从标准输入读取的名称;如果R未指定,则假定{}
- -L,-l, --max-lines=MAX-LINES,指定每次调用命令时从输入中读取的最大行数(MAX-LINES),而非默认的按参数数量分割
- -n, --max-args=MAX-ARGS,控制每次命令执行时传递的参数数量
- -P, --max-procs=MAX-PROCS,指定同时运行的命令进程的最大数量(MAX-PROCS),默认值为1(串行执行)
- -p, --interactive,运行命令前提示
- --process-slot-var=VAR,设置子进程中的环境变量VAR
- -r, --no-run-if-empty,当标准输入为空时,阻止xargs执行后续命令;默认情况下,即使输入为空,xargs也会执行一次命令(无参数调用)
- -s, --max-chars=MAX-CHARS,限制命令行参数的总字符数,避免因参数过长导致系统错误
- --show-limits,显示命令行长度限制;可使用 -s 自定义
- -t, --verbose,执行命令前打印命令
- --version,打印版本号
- -x, --exit,如果超出大小(参见-s)退出
4.常用用例
4.1.多行合并一行
[root@node4 ~]# cat a # 文件内容多行
this
is
a
nice
day
[root@node4 ~]# cat a | xargs # 转换为一行
this is a nice day
[root@node4 ~]#
4.2.指定分隔符,每两个内容输出一行
将"this|is|a|nice|day"按照'|'作为分隔符,并且每两个field作为输出行内容,整体转成列
[root@node4 ~]# echo 'this|is|a|nice|day' |xargs -d '|' -n 2 # 最后多一个空行
this is
a nice
day
[root@node4 ~]#
4.3.kill指定进程名称的进程
kill进程名称为irq相关的进程
ps -ef |grep irq |awk '{print $2}' |xargs kill -9
4.4.重命名文件夹
将目录中所有文件夹的名称重命名为 xxx_bk ,$NF->打印最后一列
ls -l | grep ^d | awk '{print $NF}' | xargs -tI {} mv {} {}_bk
4.5.将参数传递给后续程序
将匹配的结果传给一个脚本,作为脚本参数运行
ls -l | grep ^d | awk '{print $NF}' | xargs -tI {} sh xx.sh {}
注: xargs 通过-I参数,还能再将某个脚本进行传入
4.6.删除文件中的文件列表
xargs -a t.txt rm
4.7.每次读取两个参数执行命令
xargs -a list.txt -n 2 ls -l
4.8.指定结束位置
echo "file1 file2 STOP file3" | xargs -E STOP echo # 遇到STOP停止,则只输出file1 file2
find . -name "*.tmp" -print | xargs -E ".git" rm # 遇到 ".git" 目录时停止删除
4.9.批量删除文件
有时候需要删除太多日志文件,直接删除会报错,可以通过如下方式来分批删除
find . -name "*.log" | xargs -L 2 rm # 每次删除最多 2 行匹配的文件路径
4.10.多进程处理
echo "file1 file2 file3" | xargs -P 3 -n 1 touch # 同时启动3个进程,分别创建文件
find /var/log -name "*.log" | xargs -P 4 -I {} gzip {} # 批量压缩日志
4.11.提示是否执行
find . -name "*.tmp" | xargs -p rm
echo "file1 file2" | xargs -p -I{} mv {} {}.bak
4.12.限制命令及参数大小
find . -name "*.log" | xargs -s 4096 rm # 单次 rm 命令参数不超过 4096 字符
xargs --show-limits # 显示系统对命令行长度的限制
ls *.txt | xargs -s 2048 echo # 强制分批次处理超长参数
4.13.有参数传入才执行
find /tmp -name "*.log" | xargs -r rm # find执行为空时,-r 会控制xargs不执行(不报错);
find /tmp -name "*.log" | xargs rm # find执行为空时,没有-r xargs会执行一次(报错);
awk '/pattern/{print $1}' | xargs -r wget # 防止 wget 无 URL 时出错