shell基础知识8-xargs命令
简介
xargs 命令应该紧跟在管道操作符之后。它使用标准输入作为主要的数据源,将从 stdin 中
读取的数据作为指定命令的参数并执行该命令。
将多行输入转换成单行输出
[root@dns-node2 ~]# cat example.txt | xargs
1 2 3 4 5 6 7 8 9 10 11 12 13
将单行输入转换成多行输出。
-n 指定每行个数
[root@dns-node2 ~]# cat example.txt | xargs -n 3
1 2 3
4 5 6
7 8 9
10 11 12
13
指定分隔符
xargs 命令接受来自 stdin 的输入,将数据解析成单个元素,然后调用指定命令并将这些元
素作为该命令的参数。 xargs 默认使用空白字符分割输入并执行/ bin/echo 。
如果文件或目录名中包含空格(甚至是换行)的话,使用空白字符来分割输入就会出现问题。
比如My Documents目录就会被解析成两个元素: My 和 Documents ,而这两者均不存在。
天无绝人之路,这次也不例外。
我们可以定义一个用来分隔参数的分隔符。 -d 选项可以为输入数据指定自定义的分隔符
[root@dns-node2 ~]# echo "a1xb2xc3xd4" | xargs -d x
a1 b2 c3 d4
xargs 命令可以同 find 命令很好地结合在一起。 find 的输出可以通过管道传给 xargs, 由后
者执行 -exec 选项所无法处理的复杂操作。如果文件系统的有些文件名中包含空格, find 命令的
-print0 选项可以使用 0 (NULL)来分隔查找到的元素,然后再用 xargs 对应的 -0 选项进行解
析。
[root@dns-node2 tmp]# find ./ -iname "*.sh" |xargs -0 grep sleep -L
grep: ./testSet.sh
读取stdin,为命令传入格式化参数
先说下我们的需求:
1 我们有参数保存在参数文件里面,我们要从这个参数文件里面读取参数并且提供给某个命令使用,那我们可以使用xargs来结合使用
首先查看参数列表:
[root@dns-node2 tmp]# cat args.txt
timeout 3
interval 3
hostname 1.1.1.1
那下一步就是把这些参数都传给脚本
[root@dns-node2 tmp]# cat args.txt | xargs -n 2 ./testPrint.sh
通过-n 参数来控制传多少个参数给testPring.sh ,如果不写-n 那么就把所有参数传入给testPrint.sh ,否则就由-n来指定参数个数。-n 1就是传一个参数。
2 第二种情况是假设我们脚本需要2个参数,其中有一个参数时固定的,另外一个参数可变的。那怎么保持固定参数不变呢?通过-I参数来指定替换字符串。这个字符串会在 xargs 解析输入时被参
数替换掉。如果将 -I 与 xargs 结合使用,对于每一个参数,指定命令只会执行一次,此时如果结合-n使用的话,-n是无效的
[root@dns-node2 tmp]# cat args.txt | xargs -I {} ./testPrint.sh {} fixedArgs
timeout 3 fixedArgs#
interval 3 fixedArgs#
hostname 1.1.1.1 fixedArgs#
-I {} 指定了替换字符串。为该命令提供的各个参数会通过 stdin 读取并依次替换掉字符串 {} 。
使用 -I 的时候,命令以循环的方式执行。如果有3个参数,那么命令就会连
同 {} 一起被执行3次。 {} 会在每次执行中被替换为相应的参数。
结合find使用xargs
使用 find 命令的 -print0 选项生成以空字符( '\0' )作为分隔符的输出,然后将其作为
xargs 命令的输入
如果不使用-print0的话而在xargs 使用-0参数的话,因为两者发生矛盾了,大家可以看到下面第一条命令报错了
[root@dns-node2 tmp]# find . -type f -name "*.txt" | xargs -0 ls -l
ls: cannot access ./output.txt
./args.txt
: No such file or directory # 报错了?,没有使用-print0
[root@dns-node2 tmp]# find . -type f -name "*.txt" -print0 | xargs -0 ls -l
-rw-r--r-- 1 root root 38 Sep 16 22:49 ./args.txt
-rw-r--r-- 1 root root 8 Sep 4 22:28 ./output.txt
结合stdin ,巧妙运用while语句和子shell
xargs 会将参数放置在指定命令的尾部,因此无法为多组命令提供参数。我们可以通过创建子shell来处理这种复杂情况。子shell利用while循环读取参数并执行命令,有2种方法,就像这样:
1 方法1
[root@dns-node2 tmp]# ls *.sh | (while read arg; do cat $arg; done)
2 方法2
[root@dns-node2 tmp]# ls *.sh | xargs -I a cat a
在 while 循环中,可以将 cat $arg 替换成任意数量的命令,这样我们就可以对同一个参数
执行多条命令。也可以不借助管道将输出传递给其他命令。这种利用 () 创建子shell的技巧可以应
用于各种问题场景。子shell操作符内部的多条命令在执行时就像一个整体,因此:
$ cmd0 | ( cmd1;cmd2;cmd3) | cmd4
如果 cmd1 是 cd / ,那么就会改变子shell工作目录,然而这种改变仅局限于该子shell内部。
cmd4 则不受工作目录变化的影响。
shell的 -c 选项可以调用子shell来执行命令行脚本。它可以与 xargs 结合解决多次替换的问
题。下列命令找出了所有的C文件并显示出每个文件的名字,文件名前会加上一个换行符( -e 选
项允许进行转义替换)。在文件名之后是该文件中含有main的所有行:
[root@dns-node2 tmp]# ls *.sh | xargs -I {} sh -c "echo -ne '\n {}: ';grep sleep {}"
shell基础知识8-xargs命令的更多相关文章
- Linux shell基础知识(上)
Linux shell基础知识(上) 目录 一.shell介绍 二.命令历史 三.命令补全和别名 四.通配符 五.输入输出重定向 六.管道符和作业控制 七.shell变量 八.环境变量配置文件 九.b ...
- Linux Shell 基础知识(一)
1. 本文知识结构 2. shell 基础知识 2.1 shell 简单介绍 GNU bash shell 能提供对 Linux 系统的交互式访问,一般来说,使用快捷键 Ctrl + Alt + ...
- Shell编程(二)——shell的基础知识及常用命令
shell的基础知识 一.bash有以下特点: 1.记录命令历史 2.指令和文件名补全 3.别名 alias rm='rm -i' 4.通配符 * 0个或多个字符 ?匹配一个字符 5 输入输出重定向 ...
- Shell 基础知识和总结
调试脚本 检查脚本语法错误 bash -n /path/to/some_script 调试执行 bash -x /path/to/some_script shell里的变量 本地变量:只对当前shel ...
- shell基础知识总结
1. shell 对于一台计算机而言,其硬件受系统内核的控制,使用者想要控制计算机,就必须有与系统内核进行通讯的手段.而shell就是使用者与计算机进行通讯的手段之一.从命名上看,shell其实是相对 ...
- shell基础知识---与监听服务器长连接端口状态
从未写过脚本我的最近接了俩脚本的需求,就在这分享一下我的我学到基础知识主要就四部分内容 一.变量 变量的定义 string='字符串' string="字符串" num=808st ...
- shell基础知识讲解
第1章 shell基础 1.1 什么叫做shell编程 shell编程也叫做bash高级编程语法 1.2 常见的shell命令解释器 bash redhat和centos使用 d ...
- shell基础知识
Shell 学习基础 1.组合命令的符号 管道,将前面一个命令的结果作为后面一个命令的输入 分号,顺序执行用分号分割的命令 重定向,重定向包括三种:输入重定向.输出重定向.错误重定向,以7个不同的符号 ...
- shell基础知识查缺补漏
最近在看<Linux程序设计(第4版)>,其中有一个章节主要讲了shell脚本方面的,内容不细,但是利用较短的篇幅讲的也不少了.对我们自己来说也是一个查缺补漏的过程,所以就写下这篇读书笔记 ...
随机推荐
- Android 还可以走多久?
最近,有位知识星球的球友问我这么一个问题: 我做 Android 开发五年多时间了,但是最近总是很焦虑,看着人工智能越来越火,很担心 Android 要不行了,想问下,我现在要转行么?Android ...
- js--同步运动json下
这一节针对上一节讲述的bug,我们来处理一下. 这个bug存在的原因就是,一旦只要有一个属性值达到目标值就会清除定时器,所以我们要改变 的就是清除定时器的那么部分.看下面的修改 var timer; ...
- test20191210 钟子谦
100+40+0=140.暴力没写满-- 简单模拟 很久很久以前,有一个 \(1\sim n\) 的排列 \(a\),还有一个长度为 \(q\) 的,每个元素在 \(1\) 到 \(n\) 之间的序列 ...
- oracle row_number() over(partition by .. order by ..)和rank() over(partition by .. order by ..) 和dense_rank() over(partition by .. order by ..)的相似点与区别
新建一个测试表 create table dim_ia_test2(device_number varchar2(20),desc2 varchar2(20)) 插入数据后得到: 一.oracle r ...
- 开启了wpjam以后网站语言不能设置英文的解决方法
一位网友问ytkah开启了wpjam以后网站语言不能设置英文了这是什么情况?选择English保存以后还是简体中文,禁用插件再设置语言是可以设为English,好几个站点都是这样 其实很简单,只要把这 ...
- eclipse 中的注释 快捷键 多行注释快捷键 单行注释快捷键
Eclipse 中的两种注释方法: (1)多行注释(2)单行注释 一. 多行注释快捷键 1:添加注释Ctrl+Shift+/ : 添加/* */注释 示例:选中代码块后按下快捷键即可 /* fl ...
- accept返回的socket的端口号和连接socket一样的!!! socket绑定信息结构
今天与同学争执一个话题:由于socket的accept函数在有客户端连接的时候产生了新的socket用于服务该客户端,那么,这个新的socket到底有没有占用一个新的端口? 讨论完后,才发现,自己虽然 ...
- python 定时任务 from apscheduler.schedulers.blocking import BlockingScheduler
说明:使用python内置的模块来实现,本篇博客只是以循环定时来示范,其他的可以结合crontab的风格自己设定 一.导包 from apscheduler.schedulers.blocking i ...
- day003-python初识
基本的写代码流程:1.创建 xxx.py文件 注意:文件不要保存在中文的路径下,和文件名不要以中文命名. 2.写代码 a.注意两行文件头 #! /usr/bin/env python # -*- c ...
- LeetCode 916. Word Subsets
原题链接在这里:https://leetcode.com/problems/word-subsets/ 题目: We are given two arrays A and B of words. E ...