下面对fcicq中的这篇文章 别拿这些太当回事: 就这些命令做一些解释, 做个深入浅出版的哈。

其实就是这些命令的排列组合:

  • awk用于写简单脚本;
  • sed用于正则表达式替换;
  • sort用于排序;
  • uniq用于统计。
  1. 最简单的sitemap

    原文命令:

     ls *.html | awk '{ print "<a href=\"" $1 "\">" $1 "</a><br />" } '
    

    解释:

    • ls 的结果是每行一个文件名。
    • awk 是一个简单的脚本解释器,默认情况下它会将标准输入的结果用空格分隔,并把每一段保存到$1、$2……等变量中。
    • 因此上面这个命令就能将每个文件名都变成链接。
    • 用sed可能更简短一些:

        ls .html | sed -e 's/.*/<a href="&">&<\/a>/'
      
  2. 汇总

    样本文件:

     ====================
     a
     a
     b
     b
     a
     b
     c
     a
     d
     b
     b
     b
     d
     a
     c
     b
     ====================
    

    原文命令:

     cat file1 | sort | uniq -c | sort -rn
    

    解释:

    • sort再uniq,可以过滤掉文件中的重复行
    • uniq -c在每行前面显示该行的出现次数
    • sort的两个参数:-r,逆序排序;-n,将排序字段当作数字而不是字符串。
  3. 还是汇总

    样本文件:

     ====================
     2001 a 1
     2001 a 1
     2002 b 2
     2002 b 3
     2003 a 4
     2001 b 3
     2001 c 3
     2003 a 3
     2004 d 3
     2004 b 3
     2004 b 3
     2005 b 3
     2005 d 3
     2005 a 1
     2006 c 2
     2001 b 2
     ====================
    

    原文命令:

     cat file2 | cut -d" " -f1,3 | \
       awk '{ a[$1]+=$2 } END { for (i in a) print i, a[i]; }' | \
       sort -rn -k2
    

    解释:

    • cut取出行中指定的字段。-d参数指定字段之间的分隔符,-f指定取出哪个字段。
    • awk依次从输入中读取每一行并执行指定的脚本,但在所有行读入完毕后会执行一次END脚本;
    • sort的-k参数指定按照第几个字段排序。
  4. 单词统计(居然又是汇总…)

    样本文件:

     ====================
     hello world who am i
     i say hello world
     who is fcicq
     i do not know who is fcicq
     why not to find out
     ====================
    

    原文命令:

     cat file3 | sed -e "s/ /\n/g" | sort | uniq -c | sort -rn
    
    • sed也是从输入中读取并对每一行执行指定的命令。s///是正则式替换。
    • 此例中将空格替换成换行,做成每行一个单词,再用sort uniq进行统计。
    • 如果用vim的话可以用下面的命令:

        :%s/ /\r/g
        :g/^\s*$/d
        :%!sort
        :%!uniq -c
        :%!sort -rn