[root@test88 ~]# vim word_freq.sh #!/bin/bash if [ $# -ne 1 ];then echo "Usage: $0 filename"; exit -1 fi filename=$1 egrep -o "[[:alpha:]]+" $filename | awk '{count[$0]++}END{printf("%-14s%s ","Word","Count");for (ind in count){ printf("%-14s%d ",ind,count[ind]);}}' [root@test88 ~]# sh word_freq.sh test.txt Word Count test 1 oldboy 1 liyong 1 #egrep -o 表示只打印匹配到的字符,由换行符分割 #是正则表达式里的单词边界符,位于能构成单词的字符(字母数字下划线)和不能构成单词的字符之间 #比如一段文本: [root@test88 ~]# vim boundary.txt peter 2is learning linux. [root@test88 ~]# egrep -o "[[:alpha:]]+" boundary.txt peter is learning linux [root@test88 ~]# egrep -o "[[:alpha:]]+" boundary.txt peter learning #is没匹配出来 linux #显然单词边界的作用在于先划定一段区域,从非单词部分开始到非单词部分结束,然后看区域内容是否匹配。从而能保证连续的一段内一定全是字母,没有数字或者下划线。通常写单词都是一个单词空一个,如果单词内出现数字或下划线就不认为是单词。如果不加实际上匹配的是一串连续字母。 #count是一个关联数组,count[$0]表示索引为$0的值,当使用count[$0]++的时候,count[$0]的值默认为0的整型,而且这个值是变化的,索引每重复一次,值就加一。