zoukankan      html  css  js  c++  java
  • xargs、sort、uniq命令

    xargs、sort、uniq命令,我们由LeetCode的一道题来引入,并使用加以理解;

    题目是这样的:写一个 bash 脚本以统计一个文本文件 words.txt 中每个单词出现的频率。

    words.txt的内容为:

    the day is sunny the the
    the sunny is is

    1.cat words.txt | sort 来看下会是什么效果

    [root@Server-n93yom tmp]# cat words.txt | sort
    the day is sunny the the
    the sunny is is

      sort 命令将以默认的方式将文本文件的第一列以ASCII 码的次序排列,并将结果输出到标准输出。

     2.使用 cat words.txt | xargs -n1 | sort | uniq -c   看下是什么效果

    [root@Server-n93yom tmp]# cat words.txt | xargs -n1 | sort | uniq -c
          1 day
          3 is
          2 sunny
          4 the

     uniq命令只能对相邻行进行去重复操作,所以在进行去重前,先要对文本行进行排序,使重复行集中到一起,这就是为什么要先sort的原因;-c 是统计数量

      3.使用 cat words.txt | xargs -n1 | sort | uniq -c  | sort -nr 看下是什么效果

    [root@Server-n93yom tmp]# cat words.txt | xargs -n1 | sort | uniq -c | sort -n
          1 day
          2 sunny
          3 is
          4 the
    [root@Server-n93yom tmp]# cat words.txt | xargs -n1 | sort | uniq -c | sort -nr
          4 the
          3 is
          2 sunny
          1 day

        sort -n 是按照数字进行排序,默认是升序的,-r是降序,所以sort -nr就是按照数字进行降序排序

       4. 再结合上awk命令输出结果即可:

        cat words.txt | xargs -n1 | sort | uniq -c | sort -nr | awk '{print $2" "$1}'

    [root@Server-n93yom tmp]# cat words.txt | xargs -n1 | sort | uniq -c | sort -nr | awk '{print $2" "$1}'
    the 4
    is 3
    sunny 2
    day 1

    下面介绍下xargs命令:

       1. cat words.txt | xargs 是把文本变为一行输出   

    [root@Server-n93yom tmp]# cat words.txt | xargs
    the day is sunny the the the sunny is is

        加上-n 数字  把文本变成多行输出,数字是每行的单词数

    [root@Server-n93yom tmp]# cat words.txt | xargs -n1
    the
    day
    is
    sunny
    the
    the
    the
    sunny
    is
    is

     xargs -dx 指定分隔符进行输出

    [root@Server-n93yom tmp]# echo "nameXnameXnameXname" | xargs -dX
    name name name name

    定义一个脚本sk.sh

    #!/bin/bash
    #sk.sh命令内容,打印出所有参数。
    
    echo $*

    然后执行命令:cat words.txt | xargs -I {} ./sk.sh -p {} -l

    xargs 的一个选项 -I,使用 -I 指定一个替换字符串 {},这个字符串在 xargs 扩展时会被替换掉,当 -I 与 xargs 结合使用,每一个参数命令都会被执行一次:

    [root@Server-n93yom tmp]# cat words.txt | xargs -I {} ./sk.sh -p {} -l
    -p the day is sunny the the -l
    -p the sunny is is -l

    把当前文件夹下所有的.sh文件copy到tmp文件下

     ls *.sh | xargs -n1 -I {} cp {} /root/tmp/

    [root@Server-n93yom ~]# ll
    total 20-rw-r--r--  1 root root      49 Aug 15 17:01 mysql.sh-rw-r--r--  1 root root     640 Aug 15 17:13 upgrade.sh
    [root@Server-n93yom ~]# ls *.sh | xargs -n1 -I {} cp {} /root/tmp/
    [root@Server-n93yom ~]# cd tmp/
    [root@Server-n93yom tmp]# ll
    total 20
    -rw-r--r-- 1 root root   49 Aug 22 22:53 mysql.sh
    -rw-r--r-- 1 root root 1559 Aug 19 23:13 passwd
    -rwxr-xr-x 1 root root   21 Aug 22 22:44 sk.sh
    -rw-r--r-- 1 root root  640 Aug 22 22:53 upgrade.sh
    -rw-r--r-- 1 root root   41 Aug 22 14:03 words.txt

    xargs 结合 find 使用

    用 rm 删除太多的文件时候,可能得到一个错误信息:/bin/rm Argument list too long. 用 xargs 去避免这个问题:
    
    find . -type f -name "*.log" -print0 | xargs -0 rm -f
    xargs -0 将  作为定界符。
    
    统计一个源代码目录中所有 php 文件的行数:
    
    find . -type f -name "*.php" -print0 | xargs -0 wc -l
    查找所有的 jpg 文件,并且压缩它们:
    
    find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz
    xargs 其他应用
    
    假如你有一个文件包含了很多你希望下载的 URL,你能够使用 xargs下载所有链接:
    
    # cat url-list.txt | xargs wget -c

    参考:https://www.runoob.com/linux/linux-comm-xargs.html

  • 相关阅读:
    linux安装jenkins
    linux安装python3.8
    python类继承多态
    python字典排序
    第一篇
    第十一周编程总结
    2019春第十周作业
    2019年寒假作业1
    2019年寒假作业3
    学期总结
  • 原文地址:https://www.cnblogs.com/guanbin-529/p/11397377.html
Copyright © 2011-2022 走看看