Linux(Centos 7.6)命令详解:xargs

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 时出错
相关推荐
且从容.2 小时前
Ubuntu安装flume
linux·ubuntu·flume
承渊政道2 小时前
Linux网络学习【Reactor反应堆模式】
linux·网络·学习·ubuntu·reactor
讯捷蓝达4 小时前
戴尔R720xd服务器卡死在 “Configuring Memory...Done“,换了内存还是卡?问题根本不在内存
运维·服务器
且从容.5 小时前
ubuntu安装flink
linux·ubuntu·flink
数字新视界6 小时前
动环监控信创适配在智能机房管理中的应用价值与未来展望
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
爱和冰阔落6 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨6 小时前
WSL2的安装与使用
linux·wsl
微小的鱼7 小时前
Linux的渲染与显示系统链路
android·java·linux
lisanmengmeng7 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
Android系统攻城狮8 小时前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频