文章目录

  • 前言
  • xargs命令与管道的2点区别
    • 区别1:命令B有时候是不接受管道传参的
    • 区别2:管道传递参数的是字符串
  • xargs实战
    • 场景1:xargs -i:查找指定格式的文件,并复制到别处
    • 场景2:xargs -d:指定分隔符
    • 场景3:xargs -t或者-p:命令执行之前先打印下最终要执行的命令
    • 场景4:xargs -n或者-L:我想find 多个匹配
    • 场景5:xargs -I:给参数赋值给变量

前言

xargs命令是获取标准输入来给其他命令传递参数的,
所以xargs一般与管道符(|)一起使用
其作用与管道符(|)类似
但是Linux命令用得多了就有了个疑问:
xargs命令与管道(|)到底有什么区别?
xargs应该怎么用呢?

shell命令加管道(|)的一般形式为(小括号里的xargs表示可选):

echo "hello world" | (xargs) echo

这里我们先作下约定:
管道(”|“)前面的命令(echo "hello world")我们叫它命令A
管道(”|“)后面的命令[(xargs) echo]我们叫它命令B

xargs命令与管道的2点区别

xargs与管道只有2点区别:

区别1:命令B有时候是不接受管道传参的

接受管道传参的命令:catgreplswcawksed

需要说明的是接受管道传参的命令也能用xargs传参,
这个就用到第2点区别了

不接受管道传参的命令:echormkillmkdirtouchcpmv
不接受管道传参的命令一般会报缺少参数的错误:

$ cat test.txt |  touch
touch: missing file operand
Try 'touch --help' for more information.wedo at slave2 in /opt
$ cat test.txt |  mkdir
mkdir: missing operand
Try 'mkdir --help' for more information.

区别2:管道传递参数的是字符串

管道把标准输入用引号引起来,表示1个参数
xargs没有用引号引起来,如果有空格会被识别为多个参数
我们来看一个例子:
命令1:

echo "--help" | cat

命令2:

echo "--help" | xargs cat

看下输出结果:

$ echo "--help" | cat
--help$ echo "--help" | xargs cat
Usage: cat [OPTION]... [FILE]...
Concatenate FILE(s), or standard input, to standard output.-A, --show-all           equivalent to -vET-b, --number-nonblank    number nonempty output lines, overrides -n-e                       equivalent to -vE-E, --show-ends          display $ at end of each line-n, --number             number all output lines-s, --squeeze-blank      suppress repeated empty output lines-t                       equivalent to -vT-T, --show-tabs          display TAB characters as ^I-u                       (ignored)-v, --show-nonprinting   use ^ and M- notation, except for LFD and TAB--help     display this help and exit--version  output version information and exit
。。。

我们发现命令1中的cat命令相当于执行的是:

cat "--help"

命令2中的cat命令相当于执行的是:

cat --help

那加不加引号又有什么区别呢?
区别大了,你可以想像一下命令A的输出如果有空格会出现什么情况呢?

加引号相当于给命令B传递的只有1个参数,而且只是一个由引号引起的字符串

不加引号,同时命令A的输出结果还有空格,就可能给命令B传递多个参数,

注:
写shell脚本的时候好多时候都最好给命令的参数加个引号,不然万一传递的参数中有空格,就会被识别为多个参数

看下面2个需求:
我们希望查找:以.sh结尾的文件中,包含xargs字符串的文件
我们首先想到的命令是:

find ./ -name "*.sh" | grep "xargs"

输出结果:

我们发现这个命令只是找出了当前目录下包含xargs字符串的文件名
这是因为我们find命令的结果,被加了引号后,作为字符串,传给grep去查找,grep实际执行的的其实是:

grep "xargs" "./xargs_demo.sh"

正确的应该是:

find ./ -name "*.sh" | xargs  grep "xargs"

于是我们发现./realtime_import_stop.sh这个文件中有用到xargs命令

$ find ./ -name "*.sh" | xargs  grep "xargs"
./realtime_import_stop.sh:ps aux | grep AppGenerateEverySecond | grep -v "grep" | awk '{print $2}' | xargs kill -s 9

换句话说xargs可以通过管道给后面的命令传递多个参数,而且不会被当成字符串

xargs实战

场景1:xargs -i:查找指定格式的文件,并复制到别处

xargs一般是把参数追加到命令的最后,但是如果我想把参数放在命令的中间怎么办呢?于是就有了参数-i

find . -name "*.sh" | xargs -i cp {} /opt/temp

-i参数后可以直接用{}捕获传递的参数
当然你也可以使用-I参数直接将参数赋值给指定变量,下面会讲

这是最常用的使用场景,下面的是不那么常用的,不过也很有用

场景2:xargs -d:指定分隔符

xargs默认以空格分隔参数,如果我希望是其他的分隔符呢?于是就有了参数-d

echo "file1 file2 file3" | xargs echo
echo "file1,file2,file3" | xargs -d "," echo

两个命令意思是一样的:

哇,能指定分隔符,这不是很有用吗?
你可以执行下下面的命令试试:

echo "file1 file2 file3" | xargs mkdir
echo "file1,file2,file3" | xargs -d "," mkdir

这个时候输出结果就不一样了

为什么会出现这种情况呢?
xargs默认会处理空格,制表符,还有换行,但是你把分隔符指定为逗号,于是它就不处理其他的空白符了

场景3:xargs -t或者-p:命令执行之前先打印下最终要执行的命令

使用参数-t-p
-t不询问,直接执行
-p用户确认(输入y)后执行
可以自己试试下面的命令:

echo "file1,file2,file3" | xargs -d "," -t mkdir
echo "file1,file2,file3" | xargs -d "," -p mkdir

场景4:xargs -n或者-L:我想find 多个匹配

我想同时查找以.sh或以.log结尾的文件怎么办呢?
方法1:

echo "*.sh *.log" | xargs -n 1 find . -name

-n:参数的意思为每次传递多少个参数给命令B执行,
-n 1:意为xargs接收标准输入后按空格分成了2个参数,但是一次只给命令B传1个

方法2

echo "*.sh\n*.log" | xargs -L 1 find . -name

-L参数的意思为每次传递多少行参数给命令B执行
-L 1意为xargs接收标准输入后把 参数分隔成了2行,1行1个参数,一次给命令B传1行参数

场景5:xargs -I:给参数赋值给变量

-I参数可以把值赋给变量
这个场景更加不常用,
也不是说不常用,因为一般能用这个参实现的用-i都能实现
不过可以试试下面的命令:

echo "file1 file2 file3" | xargs -I var sh -c "echo var; touch var"

该命令意为将标准输入传递的值赋值给变量var
然后先打印变量值,再创建文件
一般来说-I都使用-i参数搞定,

echo "file1 file2 file3" | xargs -i sh -c "echo {}; touch {}"

两个命令意思是一样的

xargs使用教程:在实战中学习xargs相关推荐

  1. Regeorg 从python2改造为python3-从实战中学习socks5协议

    Regeorg 从python2改造为python3-从实战中学习socks5协议 问题描述 解决过程 环境准备 过程 这两天没啥工作,一般这时候我都不会发挥自己的主观能动性去主动找活,于是乎只能上网 ...

  2. 尚硅谷JavaScript高级教程(javascript实战进阶)学习笔记

    前言 这个是我学习过程中的笔记,分享给大家,希望对大家有用. 学习内容是尚硅谷JavaScript高级教程(javascript实战进阶),这里是视频链接. 我在前面有两篇对于web前端HTML和CS ...

  3. Robot Framework 实战中学习(Web自动化)

    Robot Framework 自动化框架可以实现的功能及其丰富,首先从Web自动化开始总结学习(由于引用Selenium2Library,因此与Selenium页面元素定位及操作类似),后面也会依次 ...

  4. 实战中学习浏览器工作原理 — 之 HTTP 请求与解析

    我是三钻,一个在<技术银河>中等你们一起来终生漂泊学习. 点赞是力量,关注是认可,评论是关爱!下期再见

  5. linux shell脚本学习xargs命令使用详解

    xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理.通常情况下,xargs从管道或者stdin中读取数据,但是它也能够从 ...

  6. linux xargs命令_如何在Linux中使用xargs命令?

    linux xargs命令 The xargs command allows us to pass the output of one command as the input for another ...

  7. xargs 命令教程

    xargs 命令教程 转自:http://www.ruanyifeng.com/blog/2019/08/xargs-tutorial.html 作者: 阮一峰 日期: 2019年8月 8日 xarg ...

  8. 深度学习与自然语言处理教程(8) - NLP中的卷积神经网络(NLP通关指南·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/36 本文地址:https://www.showmeai.tech/article-d ...

  9. 《Autosar从入门到精通-实战篇》总目录_培训教程持续更新中...

    目录 一.Autosar入门篇: 1.1 DBC专题(共9篇) 1.2 ARXML专题(共35篇) 1.2.1 CAN Matrix Arxml(共28篇) 1.2.2 ASWC Arxml(共7篇) ...

最新文章

  1. MySQL5.1升级到5.5注意事项
  2. Sql Server 调用DLL
  3. mongodb 关闭服务 mongod -f /root/mongodb/bin/xx.conf --shutdown
  4. linux的文件属性和权限学习——分析ls命令结果
  5. 微信小程序消息推送自有服务器无法接收到信息,消息推送服务器配置次数用完的解决方式。
  6. 如何查看linux CPU总占用率?
  7. Excel文字输入技巧
  8. VB WindowsMediaPlayer 播放
  9. python考勤系统代码_500行python代码打造刷脸考勤系统
  10. 【乌拉圭】乌拉圭决定采用日本-巴西数字电视制式标准
  11. 【开源教程9】疯壳·开源编队无人机-定时器(LED 航情灯、指示灯闪烁)
  12. 麒麟子Cocos Creator实用技巧九:棋牌UI全分辨率适配方案
  13. 风扇空调照明灯动画的创建
  14. 去除弹窗遮罩层:modal-append-to-body=“false“
  15. 抖音蓝V认证申请流程是怎么样的?
  16. 学python后的感想_学习python的感想
  17. 4.4.1. SWE.1 Software Requirements Analysis中“Process outcomes”的第一条的正确翻译
  18. 【HCIA-cloud】【4】服务器虚拟化之存储资源管理:存储资源类型说明、存储配置模式说明【普通、精简、延迟置零】、虚拟机磁盘类型说明、FusionCompute中操作添加存储
  19. opencv(python)使用knn最近邻算法识别手写数字
  20. Hue安装、或操作过程中遇到的问题

热门文章

  1. 华为软件开发云 变革企业软件研发模式
  2. 商务邮件用什么邮箱?
  3. 全面解读算法时间复杂度
  4. 交通诱导信息发布系统服务器,高速公路交通诱导信息发布系统设计与实现
  5. Unity如何将数字图片分解成数字显示出来——第一篇笔记
  6. Realtek SDK缓冲区溢出和命令执行漏洞说明
  7. c# 通过webBrowser实现打印功能
  8. 大小端(网络字节序)等概念
  9. Win10开机密码忘了?教你破解Win10开机密码
  10. Dead Reckoning - 航位推测法