牛客SHELL
这是大佬给我提到的shell题目,打完下来感觉挺有意思的就是题目有点少了,一共34道题
第一题 统计文件的行数
这个我直接工具操作,我也会给出大佬优雅的处理方案
第二题 打印文件的最后5行
我还是使用工具
第三题输出0到500中7的倍数
1
| for i in {0..500..7};do echo $i;done
|
我写得完全是最朴素方案,
第四题 打印文件第五行内容
面向答案编写
第五题 打印空行的行号
1
| grep -n '^$'|awk -F: '{print $1}'
|
主要是找到空行的行数
第六题 去掉空行
记得xargs挺好用的
第七题 打印字母数小于8的单词
1
| awk '{for(i=1;i<=NF;i++){if(length($i)<8)print $i}}'
|
循环每一行判断是否小于八
第八题 统计所有进程占用内存百分比的和
1
| awk '{a+=$4}END{print a}'
|
取出内容列相加
第九题 统计每个单词出现的个数
1
| awk '{for(i=1;i<=NF;i++){print $i}}'|sort|uniq -c| sort -n | awk '{print $2,$1}'
|
这个方案选中需要的行数开始计数输出
第十题 第二列是否有重复
1
| awk -F ' ' '{print $2}'|sort |uniq -cd |sort -n
|
1
| awk '{if(!a[$2]){a[$2]=1}else{a[$2]++}}END{for(i in a){if(a[i]>1)print a[i],i}}'
|
跟统计数方案差不多
第十一题 转置文件的内容
1
| cat nowcoder.txt|awk -F ' ' '{print $1}'|xargs && cat nowcoder.txt|awk -F ' ' '{print $2}'|xargs
|
1
| awk '{for(i=1;i<=NF;i++){a[NR,i]=$i}}END{for(i=1;i<=NF;i++){for(j=1;j<=NR;j++){printf a[j,i]" "}print x}}'
|
面向答案编程
第十二题 打印每一行出现的数字个数
1
| awk -F "[1-5]" '{a+=NF-1;print "line"NR " number: "NF-1} END {print "sum is "a}'
|
主要找出数字
第十三题 去掉所有包含this的句子
直接grep
第十四题 求平均值
1
| awk 'NR>1{a+=$0}END{b=a/(NR-1);printf "%.3f",b}'
|
循环行数进行操作
第十五题 去掉不需要的单词
还是grep
第十六题 判断输入的是否为IP地址
1
| awk -F '.' 'NF!=4{print "error";next}NF==4{f=1;for(i=1;i<=NF;i++){if($i>255||$i<0){f=0}}}{if(f){print "yes"}else{print "no"}}'
|
这个先判断行是否.分四段,接着确认范围操作
第十七题 将字段逆序输出文件的每行
1
| awk -F ':' '{print $7":"$6":"$5":"$4":"$3":"$2":"$1}'
|
1
| awk 'BEGIN{FS=OFS=":"}{for(i=NF;i>1;i--){printf $i":"}print $1}'
|
面向答案编程
第十八题 域名进行计数排序处理
1
| awk -F '/' '{print $3}'|sort |uniq -c|sort -nr|awk -F ' ' '{print $1" "$2}'
|
1
| awk -F/ '{a[$3]++}END{for(i in a){print a[i],i}}'|sort -nrk 1
|
对于排序我都是一个逻辑
第十九题 打印等腰三角形
1
| awk 'BEGIN{n=6;l=n*2-1;for(i=1;i<=n;i++){for(j=1;j<=n-i;j++){printf " "}for(k=1;k<=i;k++){printf "* "}print x}}'
|
经典题目
第二十题 打印只有一个数字的行
1
| awk -F '[0-9]' '{if(NF==2) print $0}'
|
这个行调试输出
第二十一题 格式化输出
1
| xargs -n1 printf "%'d\n"
|
1
| perl -pe 's/(?<!^)(?=(\d{3})+$)/,/g'
|
这个perl是独一档
第二十二题 处理文本
1
| awk -F ':' '{if(!a[$1]){a[$1]=$2}else{a[$1]=a[$1]"\n"$2}}END{for(i in a){print "["i"]\n"a[i]}}'
|
这个主要是去掉重复的[???]剩下输出
第二十三题 Nginx日志分析1-IP访问次数统计
1
| grep '23/Apr/2020'|awk -F ' ' '{print $1}'|sort|uniq -c|sort -r|awk -F ' ' '{print $1 " " $2}'
|
1
| awk '/23\/Apr\/2020/{a[$1]++}END{for(i in a){print a[i],i}}'|sort -nrk 1
|
最朴素方案
第二十四题 Nginx日志分析2-统计某个时间段的IP访问量
1
| grep '23/Apr/2020:2[0-3]'|sort|awk -F ' ' '{print $1}'|uniq|wc -l|awk -F ' ' '{print $1}'
|
1
| awk -F'[ :]+' '/23\/Apr/&&($5>=20||$5<=23){a[$1]++}END{print length(a)}'
|
没直接echo算是很朴素了
第二十五题 nginx日志分析3-统计访问3次以上的IP
1
| sort|awk -F ' ' '{print $1}'|uniq -c|sort -r|awk '$1 > 3'|awk -F ' ' '{print $1 " " $2}'
|
还是这个逻辑
第二十六题 Nginx日志分析4-查询某个IP的详细访问情况
1
| grep '192.168.1.22'|awk -F ' ' '{print $7}'|sort|uniq -c|awk -F ' ' '{print $1 " " $2}'
|
1
| awk '$1=="192.168.1.22"{a[$7]++}END{for(i in a){print a[i],i}}'|sort -nrk 1
|
这几个出的感觉一样
第二十七题 nginx日志分析5-统计爬虫抓取404的次数
1
| grep 'www.baidu.com'|grep '404'|awk -F ' ' '{print $1}'|wc -w|awk -F ' ' '{print $1}'
|
1
| awk '$9=="404"&&/spider.html/{a++}END{print a}'
|
朴素
第二十八题 Nginx日志分析6-统计每分钟的请求数
1
| awk -F ':' '{print $2":"$3}'|sort|uniq -c|sort -r|awk -F ' ' '{print $1 " " $2}'
|
1
| awk -F'[ :]+' '{a[$5":"$6]++}END{for(i in a){print a[i],i}}'|sort -nrk 1
|
看好分钟是那列
第二十九题 netstat练习1-查看各个状态的连接数
1
| grep 'tcp'|awk -F ' ' '{print $6}'|xargs|sed 's/ /\n/g'|sort|uniq -cd|sort -rn|awk -F ' ' '{print $2 " " $1}'
|
1
| awk '/tcp/{a[$NF]++}END{for(i in a){print i,a[i]}}'|sort -nrk 2
|
确认为tcp
第三十题 netstat练习2-查看和3306端口建立的连接
1
| grep 'ESTABLISHED'|grep '3306'|awk -F ' ' '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|awk -F ' ' '{print $1 " " $2}'
|
1
| awk -F'[ :]+' '/tcp/&&/:3306/&&/ESTA/{a[$6]++}END{for(i in a){print a[i],i}}'|sort -nrk 1
|
这个还行
第三十一题 netstat练习3-输出每个IP的连接数
1
| grep 'tcp'|awk -F ' ' '{print $5}'|awk -F: '{print $1}'|sort |uniq -c|sort -rn|awk -F ' ' '{print $2 " " $1}'
|
1
| awk -F'[ :]+' '/tcp/{a[$6]++}END{for(i in a){print i,a[i]}}'|sort -nrk 2
|
和上一个没啥区别的感觉
第三十二题
1
| grep '3306'|awk -F ' ' '{print $5}'|awk -F: '{print $1}'|sort|uniq|wc -w|awk -F ' ' '{print "TOTAL_IP "$1}'&&cat nowcoder.txt|grep '3306'|awk -F ' ' '{print $6}'|awk -F: '{print $1}'|sort|uniq -c|awk -F ' ' '{print $2 " " $1 "\n" "TOTAL_LINK "$1}'
|
1
| awk -F '[ :]+' 'NR>2&&/:3306/{a[$6]++;n++;b[$NF]++}END{print "TOTAL_IP "length(a);print "ESTABLISHED "b["ESTABLISHED"];print "TOTAL_LINK "n}'
|
这个真答案编写代码,不过个人觉得比直接echo要好
第三十三题 业务分析-提取值
1
| awk 'BEGIN{FS="[:,]"}/version/{print "serverVersion:"$NF}/number/{print "serverName:"$NF}/OS/{print "osName:"$(NF-2);print "osVersion:"$NF}'
|
这个逻辑好奇怪给人一种echo解决的方案,写死了
评论区的吐槽
1
| awk 'BEGIN{print "MEM TOTAL"}{a+=$5;b+=$6}END{c=a/1024;d=b/1024;printf "VSZ_SUM:%.1fM,RSS_SUM:%.3fM",c,d}'
|
这些数据分析题有种前面题综合到这里,好了结束了有些对我来说还是有点难想的也算给自己查漏补缺