xargs 命令学习

一、标准输入和管道符

有些命令可以接受"标准输入"(stdin)作为参数

 | )管道符,把左边的标准输出转化为标准输入传递到右边,作为右边命令参数

grep   命令可以接受标准输入,但是有的命令不接受例如 ls   echo  cat   rm  mkdir 等命令

$ cat /etc/passwd | grep root
#grep能够接受标准输入
$ echo "one" |echo 
#echo命令不能接受标准输入,不能输出相应的结果

二、xargs 命令的作用

用做不能够接受标准输入的命令,把上述的命令改为以下的形式就可以得到想要的结果:

$ echo "one" |xargs echo 
#利用xargs 可以让不能接受标准输入的命令,接受标准输入

xargs 标准格式如下

$ xargs [-options] [command]

执行的命令紧跟xargs后面,接受xargs传来的参数

$ echo "a b c" |xargs mkdir 

以上代码就相当于

$ mkdir a b c

三、xargs单独使用

这部分不重要,xargs常用的是于管道符一起使用

$ xargs 
#等同于
$ xargs echo 
#xargs 默认后面是echo

$ xargs mkdir 
>>"one"

(CTRL+d)
#xargs mkdir 输入后,会等待输入,输入“one”后会相当于echo one ;最终建立了一个名为one的目录
#CTRL+d结束,表示输入结束,这时echo出相应的内容

四、-0 参数与 find 命令

xargsfind 命令一起用例如:

$ find -name "*.txt" |xargs rm
#找到所有的TXT文件,并删除 
$ find . -name "*.txt" | xargs grep "abc"
# 找出所有 TXT 文件以后,对每个文件搜索一次是否包含字符串abc

-o参数,避免文件名中有空格的影响。xargs默认为空格作为分隔符,不太适合处理文件名,以下的可以避免这种情况

find命令有一个特别的参数-print0,指定输出的文件列表以null分隔。然后,xargs命令的-0参数表示用null当作分隔符。

$ find -type f -print0 | xargs -0 rm
#由于分隔符是null,所以处理包含空格的文件名,也不会报错

五、-p 参数,-t 参数

-p参数打印出要执行的命令,询问用户是否要执行

$ echo "one two three" |xargs -t mkdir 
mkdir one two three ?...
#上面的命令执行以后,会打印出最终要执行的命令,让用户确认。用户输入y以后(大小写皆可),才会真正执行。

-t参数则是打印出最终要执行的命令,然后直接执行,不需要用户确认

$ echo "one two three" |xargs -t rm -r
rm -r one two three

六、-I 参数 

-I指定每一项命令行参数的替代字符串

$ cat filename
one
two
three
$ cat filename | xargs -t -I file sh -c 'echo file; mkdir file'
sh -c echo one; mkdir one 
one
sh -c echo two; mkdir two 
two
sh -c echo three; mkdir three 
three

七、-d  参数

xargs 正常情况下,把换行符和空格作为分隔符,把标准输入分解成一个个命令行参数。

-d 参数可以更改分隔符,指定分隔符

$ echo "one two three" | xargs mkdir 
# 默认的分隔符为空格和换行符
$ echo -e "a\tb\tc" |xargs -d "\t" echo
a b c
# 指定分隔符为\t,所以a\tb\tc转化成三个命令行参数,echo -e 参数解释转义字符

八、-L -n 参数

如果标准输入包含多行,-L参数指定多少行作为一个命令行参数

$ echo -e "a\nb\nc" | xargs -L 1 echo
a
b
c
#上面代码指定每行运行一次echo命令,所以echo命令执行了三次,输出了三行

-n 参数指定每次将多少项,作为命令行参数

$ echo {0..9} | xargs -n 2 echo
0 1
2 3
4 5
6 7
8 9
#每两个参数运行一次echo命令。所以,10个阿拉伯数字运行了五次echo命令,输出了五行。

xargs命令容易被忽略,但是对于处理多个文件是非常好用的,还有很多的功能有待我们发掘。

举一个我平常应用的小例子:

$ ls 2.1.1_rawdata/split/*.fq.gz | xargs -t -i sh -c "less {}|awk 'NR%4==1{print'} |sed 's/ .*//g'|sort |uniq -d |wc -l "

把每个样本 2.1.1_rawdata/split/*.fq.gz  less一下,然后根据数据中第一行的序列的id 查找是否有重复的值,这其中用到了sed命令,后续会写一篇关于shell三剑客的学习文章。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值