常用Unix统计命令(fcicq版解释)
下面对fcicq中的这篇文章 别拿这些太当回事: 就这些命令做一些解释, 做个深入浅出版的哈。
其实就是这些命令的排列组合:
- awk用于写简单脚本;
- sed用于正则表达式替换;
- sort用于排序;
- uniq用于统计。
-
最简单的sitemap
原文命令:
ls *.html | awk '{ print "<a href=\"" $1 "\">" $1 "</a><br />" } '
解释:
- ls 的结果是每行一个文件名。
- awk 是一个简单的脚本解释器,默认情况下它会将标准输入的结果用空格分隔,并把每一段保存到$1、$2……等变量中。
- 因此上面这个命令就能将每个文件名都变成链接。
-
用sed可能更简短一些:
ls .html | sed -e 's/.*/<a href="&">&<\/a>/'
-
汇总
样本文件:
==================== 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,将排序字段当作数字而不是字符串。
-
还是汇总
样本文件:
==================== 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参数指定按照第几个字段排序。
-
单词统计(居然又是汇总…)
样本文件:
==================== 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