- 统计词频
写一个 bash 脚本以统计一个文本文件 words.txt 中每个单词出现的频率。
为了简单起见,你可以假设:
- words.txt只包括小写字母和 ' ' 。
- 每个单词只由小写字母组成。
- 单词间由一个或多个空格字符分隔。
示例:
假设 words.txt 内容如下:
the day is sunny the the
the sunny is is
你的脚本应当输出(以词频降序排列):
the 4
is 3
sunny 2
day 1
题解:
cat words.txt |tr -s ' ' '\n'| sort | uniq -c | sort -nr | awk '{print $2" "$1}'
cat ——浏览文件
tr -s —— tr处理字符串,-s缩减连续重复的字符成指定的单个字符;tr -s ' ' '\n'最后将字符串空格替换成换行,保证一行只有一个单词
sort —— 排序,排序后还是有重复
uniq -c ——去重并计数,输出结果类似于 the 4;先sort再uniq -c的原因是uniq必须是相邻重复才会去重
sort -nr—— -n 依照数值的大小排序,-r 以相反的顺序来排序
awk——格式化输出,规定先输出字符串再输出数字,空格可以用' '或" ",由于外层已经有了'',所以内层只能用""
- 过滤后统计出现的次数
有一个线上服务器访问日志 格式如下(shell)
2016-11-09 11:22:05 /api/user/login 110.23.5.33
2016-11-09 11:23:10 /api/user/detail 57.3.2.16
......
2016-11-09 23:59:40 /api/user/login 200.6.5.166
要求统计11月9号下午14点(14-15点),访问/api/user/login接口top10的ip地址和数量
题解:
cat log | grep '2016-11-09 14' | grep '/api/user/login' | awk '{print $3}' | sort | uniq -c | sort -nr | head
3.有效电话号码
给定一个包含电话号码列表(一行一个电话号码)的文本文件 file.txt,写一个 bash 脚本输出所有有效的电话号码。
你可以假设一个有效的电话号码必须满足以下两种格式: (xxx) xxx-xxxx 或 xxx-xxx-xxxx。(x 表示一个数字)
你也可以假设每行前后没有多余的空格字符。
示例:
假设 file.txt 内容如下:
987-123-4567
123 456 7890
(123) 456-7890
你的脚本应当输出下列有效的电话号码:
987-123-4567
(123) 456-7890
题解
最终的正则表达式为:
^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$
//或者(括号用\s来替换)
^([0-9]{3}-|\([0-9]{3}\)\s)[0-9]{3}-[0-9]{4}$
此题可以用awk或grep都行
1.awk方式(awk的正则表达式匹配格式:awk '/你的表达式/')
awk '/^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$/' file.txt
2.grep方式(-E或者-P)
grep -E '^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$' file.txt
grep -P '^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$' file.txt
网友评论