SHELL1 统计文件的行数
wc -l < nowcoder.txt
#or
cat nowcoder.txt | wc -l
#or
awk '{i++}END{print i}' < nowcoder.txt
#or
grep -c '' nowcodet.txt
grep -c '.*' nowcodet.txt
SHELL2 打印文件的最后5行
tail -5 nowcoder.txt
SHELL3 输出7的倍数
for i in {0..500}
do
if (( $i%7==0 ))
then
echo $i
fi
done
#or
for((i=0;i<500;++i))
do
if (( $i%7==0 ))
then
echo $i
fi
done
#or
awk 'BEGIN{for(i=0;i<500;++i) if(i%7==0) print i;}'
shell中的范围for循环:for i in {0..500}
i=0
while (($i<=500))
do
if (($i%7==0))
then
echo $i
fi
let "i++"
done
SHELL4 输出第5行的内容
head -5 nowcoder.txt | tail -1
#or
sed -n '5p' nowcoder.txt
#or
awk 'NR==5{print $0}' nowcoder.txt
SHELL5 打印空行的行号
grep -n '^$' nowcoder.txt | sed 's#:##g'
#or
awk '/^$/{print NR}' nowcoder.txt
SHELL6 去掉空行
grep -v '^$' nowcoder.txt
#or
grep '.' nowcoder.txt
#or
sed -r '/^$/d' nowcoder.txt
#or
sed -nr '/^$/!p' nowcoder.txt
#or
awk '!/^$/{print $0}' nowcoder.txt
SHELL7 打印字母数小于8的单词
awk '{for(i=1;i<=NF;++i) if(length($i)<8) print $i;}' nowcoder.txt
#or
for i in $(cat nowcoder.txt)
do
if [ ${#i} -lt 8 ]
then
echo $i
fi
done
SHELL8 统计所有进程占用内存大小的和
awk '{sum+=$6}END{print sum}' nowcoder.txt
SHELL9 统计每个单词出现的个数
awk '{for(i=1;i<=NF;++i) cnt[$i]++;}END{for(j in cnt) print j,cnt[j];}' nowcoder.txt | sort -nk2
SHELL10 第二列是否有重复
awk '{cnt[$2]++}END{for(i in cnt) if(cnt[i]>1) print cnt[i],i}' nowcoder.txt
SHELL11 转置文件的内容
awk '{
for(i = 1; i <= NF; ++i){
if(NR == 1){
arr[i] = $i;
}else{
arr[i] = arr[i]" "$i;
}
}
}END{
for(i in arr){
print arr[i];
}
}' nowcoder.txt
SHELL12 打印每一行出现的数字个数
awk 'BEGIN{
FS="";
}
{
for(i=1;i<=NF;++i){if($i~/[1-5]/) cnt++;}
printf("line%d number: %d\n",NR,cnt);
sum+=cnt;
cnt=0;
}
END{
printf("sum is %d\n",sum);
}' nowcoder.txt
SHELL13 去掉所有包含this的句子
grep -v 'this'
#or
sed -nr '/this/!p'
#or
sed -r '/this/d'
SHELL14 求平均值
awk '{if(NR==1) num=$0;else sum+=$0}END{printf("%.3f",sum/num);}'
SHELL15 去掉不需要的单词
sed -n '/[bB]/!p'
SHELL16 判断输入的是否为IP地址
awk -F. '{if(NF!=4) print "error";else if($1>255||$2>255||$3>255||$4>255) print"no";else print "yes"}' nowcoder.txt
SHELL17 将字段逆序输出文件的每行
awk -F: '{
printf("%s",$NF);
for(i=NF-1;i>0;--i)
printf(":%s",$i);
print ""
}' nowcoder.txt
SHELL18 域名进行计数排序处理
awk -F"[/]+" '{cnt[$2]++}END{for(i in cnt) print cnt[i],i}' nowcoder.txt | sort -rnk1
SHELL19 打印等腰三角形
#! /bin/bash
for((i=0;i<5;++i))
do
for((j=0;j<5+i;++j))
do
if ((j<5-1-i))
then
echo -n " "
elif (((i+j)%2==0))
then
echo -n "*"
else
echo -n " "
fi
done
echo ""
done
SHELL20 打印只有一个数字的行
awk '/(^[0-9]([a-z]+)$)|(^[a-z]*[0-9]$)|(^[a-z][0-9][a-z]$)/' nowcoder.txt
#or
awk -vFS="" '{for(i=1;i<=NF;i++){if($i~/[0-9]/) k++;}if(k==1){print $0}; k=0;}' nowcoder.txt
SHELL21 格式化输出
awk 'BEGIN{FS=""}
{
for(i=1;i<=NF;++i){
printf("%s",$i);
if((NF-i)>0&&(NF-i)%3==0)
printf(",");
}
print ""
}' nowcoder.txt
SHELL22 处理文本
awk -F: '{a[$1]=a[$1]$2"\n"}END{for(i in a) printf("[%s]\n%s",i,a[i])}' nowcoder.txt
采用拼接字符串的方式处理集合问题:a[$1]=a[$1]$2"\n"
SHELL23 nginx日志分析1-IP统计
awk '/23\/Apr\/2020/{cnt[$1]++}END{for(i in cnt) print cnt[i],i}' nowcoder.txt | sort -rnk1
SHELL24 nginx日志分析2-统计某个时间段的IP
#length()有的地方不支持
awk '/23\/Apr\/2020:20:/,/23\/Apr\/2020:23:/{cnt[$1]++}END{print length(cnt)}' nowcoder.txt
#or
awk '/23\/Apr\/2020:20:/,/23\/Apr\/2020:23:/{cnt[$1]++}END{for(i in cnt) res++;print res}' nowcoder.txt
#or
awk '/23\/Apr\/2020:2[0-2]/{cnt[$1]++}END{for(i in cnt) res++;print res}' nowcoder.txt
SHELL25 nginx日志分析3-统计访问3次以上的IP
awk '{cnt[$1]++}END{for(i in cnt) if(cnt[i]>3) print cnt[i],i;}' nowcoder.txt | sort -rnk1
SHELL26 nginx日志分析4-查询某个IP的详细访问情况
grep '192.168.1.22' nowcoder.txt | awk '{cnt[$7]++}END{for(i in cnt) print cnt[i],i;}' | sort -rnk1
#or
awk '/192.168.1.22/{cnt[$7]++}END{for(i in cnt) print cnt[i],i;}' nowcoder.txt | sort -rnk1
SHELL27 nginx日志分析5-统计爬虫抓取404的次数
grep 'spider.html' nowcoder.txt | grep '404' | wc -l
#or
awk '$NF~/spider.html/' nowcoder.txt | awk '$9~/404/{cnt++} END{print cnt}'
#awk的条件是支持与逻辑的
awk '$9~/404/ && $NF~/spider.html/ {cnt++} END{print cnt}' nowcoder.txt
SHELL28 nginx日志分析6-统计每分钟的请求数
awk -F: '{cnt[$2":"$3]++}END{for(i in cnt) print cnt[i],i}' nowcoder.txt | sort -rnk1
SHELL29 netstat练习1-查看各个状态的连接数
awk '{if($NF~/ESTABLISHED/ || $NF~/LISTEN/ || $NF~/TIME_WAIT/) cnt[$NF]++;}END{for(i in cnt) print i,cnt[i];}' nowcoder.txt | sort -rnk2
#or
awk 'NR>1{if($NF~/[A-Z]+/) cnt[$NF]++;}END{for(i in cnt) print i,cnt[i];}' nowcoder.txt | sort -rnk2
SHELL30 netstat练习2-查看和3306端口建立的连接
awk 'NR>1{print $5}' nowcoder.txt | awk -F: '{if($2==3306) cnt[$1]++;}END{for(i in cnt) print cnt[i],i}' | sort -rnk1
SHELL31 netstat练习3-输出每个IP的连接数
awk 'NR>1{if($1=="tcp") print $5;}' nowcoder.txt | awk -F: '{cnt[$1]++}END{for(i in cnt) print i,cnt[i]}' | sort -rnk2
SHELL32 netstat练习4-输出和3306端口建立连接总的各个状态的数目
awk 'NR>1{if($1 == "tcp") print $5}' nowcoder.txt |
awk -F: '{if($2==3306) {
total_link++;
ip[$1]++;
}}
END{print "TOTAL_IP",length(ip);
print "ESTABLISHED",total_link;
print "TOTAL_LINK",total_link;
}'
SHELL33 业务分析-提取值
awk -F"log " '{print $NF}' nowcoder.txt |
awk -F":|," -vOFS=: '{
switch(NR){
case 1 : print "serverVersion",$2;break;
case 3 : print "serverName",$2;break;
case 4 : print "osName",$2;print "osVersion",$4;break;
default: break;
}
}'
SHELL34 ps分析-统计VSZ,RSS各自总和
awk 'NR>1{vsz+=$5;rss+=$6;}END{print "MEM TOTAL";print "VSZ_SUM:"vsz/1024"M,""RSS_SUM:"rss/1024"M"}' nowcoder.txt
VSS:为进程分配的虚拟内存的大小
RSZ:resident set size,常驻内存集大小,表示物理内存的大小
192 统计词频
awk 'BEGIN{} {
for (i = 1; i <=NF; ++i) {
cnt[$i]++;
}
} END {
for (i in cnt) {
print i, cnt[i];
}
}' words.txt | sort -rnk2
192 有效电话号码
192 转置文件
192 第十行
sed -n '10p' file.txt
#or
awk 'NR==10{print $0}'
本文汇总了33个实用的Shell脚本案例,涵盖了文件操作、循环、条件判断、文本处理、日志分析等多个方面,旨在提升Shell脚本处理能力,适用于系统管理员和开发者日常工作中对文本数据的快速处理和分析。
2172

被折叠的 条评论
为什么被折叠?



