Post

牛客 SHELL复盘

难度-Easy

牛客 SHELL复盘

牛客SHELL

这是大佬给我提到的shell题目,打完下来感觉挺有意思的就是题目有点少了,一共34道题

第一题 统计文件的行数

picture 0

1
wc -l
1
awk 'END{print NR}'

这个我直接工具操作,我也会给出大佬优雅的处理方案

第二题 打印文件的最后5行

picture 1

1
tail -5

我还是使用工具

第三题输出0到500中7的倍数

picture 2

1
for i in {0..500..7};do echo $i;done
1
seq 0  7 500

我写得完全是最朴素方案,

第四题 打印文件第五行内容

picture 3

1
head -5|tail -1
1
awk 'NR==5'

面向答案编写

第五题 打印空行的行号

picture 4

1
grep -n '^$'|awk -F: '{print $1}'
1
sed  -n '/^$/='

主要是找到空行的行数

第六题 去掉空行

picture 5

1
xargs|tr ' ' '\n'
1
grep -v '^$'

记得xargs挺好用的

第七题 打印字母数小于8的单词

picture 6

1
awk '{for(i=1;i<=NF;i++){if(length($i)<8)print $i}}'

循环每一行判断是否小于八

第八题 统计所有进程占用内存百分比的和

picture 7

1
awk '{a+=$4}END{print a}'

取出内容列相加

第九题 统计每个单词出现的个数

picture 8

1
awk '{for(i=1;i<=NF;i++){print $i}}'|sort|uniq -c| sort -n | awk '{print $2,$1}'

这个方案选中需要的行数开始计数输出

第十题 第二列是否有重复

picture 9

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}}'

面向答案编程

第十二题 打印每一行出现的数字个数

picture 10

1
awk -F "[1-5]" '{a+=NF-1;print "line"NR " number: "NF-1} END {print "sum is "a}'

主要找出数字

第十三题 去掉所有包含this的句子

picture 11

1
grep -v 'this'

直接grep

第十四题 求平均值

picture 12

1
awk 'NR>1{a+=$0}END{b=a/(NR-1);printf "%.3f",b}'

循环行数进行操作

第十五题 去掉不需要的单词

picture 13

1
grep -v 'b\|B'

还是grep

第十六题 判断输入的是否为IP地址

picture 14

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"}}'

这个先判断行是否.分四段,接着确认范围操作

第十七题 将字段逆序输出文件的每行

picture 15

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}'

面向答案编程

第十八题 域名进行计数排序处理

picture 16

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

对于排序我都是一个逻辑

第十九题 打印等腰三角形

picture 17

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}}'

经典题目

第二十题 打印只有一个数字的行

picture 18

1
awk -F '[0-9]' '{if(NF==2) print $0}'

这个行调试输出

第二十一题 格式化输出

1
xargs -n1 printf "%'d\n"
1
perl -pe 's/(?<!^)(?=(\d{3})+$)/,/g'

这个perl是独一档

第二十二题 处理文本

picture 19

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访问次数统计

picture 20

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访问量

picture 21

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

picture 22

1
sort|awk -F ' ' '{print $1}'|uniq -c|sort -r|awk '$1 > 3'|awk -F ' ' '{print $1 " " $2}'

还是这个逻辑

第二十六题 Nginx日志分析4-查询某个IP的详细访问情况

picture 23

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的次数

picture 24

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-查看各个状态的连接数

picture 25

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端口建立的连接

picture 26

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的连接数

picture 27

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

和上一个没啥区别的感觉

第三十二题

picture 28

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要好

第三十三题 业务分析-提取值

picture 29

1
awk  'BEGIN{FS="[:,]"}/version/{print "serverVersion:"$NF}/number/{print "serverName:"$NF}/OS/{print "osName:"$(NF-2);print "osVersion:"$NF}'

这个逻辑好奇怪给人一种echo解决的方案,写死了

picture 30

评论区的吐槽

第三十四题 ps分析-统计VSZ,RSS各自总和

picture 31

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}'

这些数据分析题有种前面题综合到这里,好了结束了有些对我来说还是有点难想的也算给自己查漏补缺

This post is licensed under CC BY 4.0 by the author.