文章目录
-
-
- 1、统计文件的行数
- 2、打印文件的最后5行
- 3、输出7的倍数
- 4、输出第5行的内容
- 5、打印空行的行号
- 6、去掉空行
- 7、打印字母数小于8的单词
- 8、统计所有进程占用内存大小的和
- 9、统计每个单词出现的个数
- 10、第二列是否有重复
- 11、转置文件的内容
- 12、打印每一行出现的数字个数
- 13、去掉所有包含this的句子
- 14、求平均值
- 15、去掉不需要的单词
- 16、判断输入的是否为IP地址
- 17、将字段逆序输出文件的每行
- 18、域名进行计数排序处理
- 19、打印等腰三角形
- 20、打印只有一个数字的行
- 21、格式化输出
- 22、处理文本
- 23、nginx日志分析1-IP统计
- 24、nginx日志分析2-统计某个时间段的IP
- 25、nginx日志分析3-统计访问3次以上的IP
- 26、nginx日志分析4-查询某个IP的详细访问情况
- 27、nginx日志分析5-统计爬虫抓取404的次数
- 28、nginx日志分析6-统计每分钟的请求数
- 29、netstat练习1-查看各个状态的连接数
- 30、netstat练习2-查看和3306端口建立的连接
- 31、netstat练习3-输出每个IP的连接数
- 32、netstat练习4-输出和3306端口建立连接总的各个状态的数目
- 33、业务分析-提取值
- 34、ps分析-统计VSZ,RSS各自总和
1、统计文件的行数
cat nowcoder.txt | wc -l
grep -c '' nowcoder.txt
sed -n '$=' nowcoder.txt
awk 'END{print NR}' nowcoder.txt
2、打印文件的最后5行
tail -n 5 nowcoder.txt
tail -5 nowcoder.txt
3、输出7的倍数
- 写一个 bash脚本以输出数字 0 到 500 中 7 的倍数(0 7 14 21…)的命令
seq 0 7 500
seq 0 500 | awk '$0%7==0{print $0}'
for ((i=0;i<=500;i++));do
if [ $(($i%7)) -eq 0 ];then
echo $i
fi
done
[hadoop1@hadoop1 test]$ bash ./a.sh
4、输出第5行的内容
[hadoop1@hadoop1 test]$ sed -n '5p' nowcoder.txt
[hadoop1@hadoop1 test]$ awk 'NR==5' nowcoder.txt
5、打印空行的行号
[hadoop1@hadoop1 test]$ grep -n '^$' nowcoder.txt
[hadoop1@hadoop1 test]$ grep -n '^$' nowcoder.txt | awk -F: '{print $1}'
[hadoop1@hadoop1 test]$ sed -n '/^$/=' nowcoder.txt
[hadoop1@hadoop1 test]$ awk '/^$/{print NR}' nowcoder.txt
6、去掉空行
[hadoop1@hadoop1 test]$ sed -n '/^$/!p' nowcoder.txt
[hadoop1@hadoop1 test]$ grep -v '^$' nowcoder.txt
[hadoop1@hadoop1 test]$ awk NF nowcoder.txt
7、打印字母数小于8的单词
[hadoop1@hadoop1 test]$ awk '{for(i=1;i<=NF;i++)if(length($i)<8)print $i}' nowcoder.txt
8、统计所有进程占用内存大小的和
[hadoop1@hadoop1 test]$ awk '{sum+=$6}END{print sum}' nowcoder.txt
9、统计每个单词出现的个数
[hadoop1@hadoop1 test]$ awk '{for(i=1;i<=NF;i++)array[$i]++}END{for(i in array)print i,array[i]}' nowcoder.txt
10、第二列是否有重复
[hadoop1@hadoop1 test]$ awk '{array[$2]++}END{for(i in array)if(array[i]>=2)print i}' nowcoder.txt
[hadoop1@hadoop1 test]$ awk '{array[$2]++}END{for(i in array)print i,array[i]}' nowcoder.txt
java 2
go 3
c 1
shell 1
php 1
c++ 1
python 1
[hadoop1@hadoop1 test]$ awk '{array[$2]++}END{for(i in array)if(array[i]>=2)print array[i],i}' nowcoder.txt
2 java
3 go
11、转置文件的内容
[hadoop1@hadoop1 test]$ awk '{a=(a""$1" ");b=(b""$2" ")}END{print a"\n"b}' s.txt
a=$( cat s.txt | awk '{print $1}' )
b=$( cat s.txt | awk '{print $2}' )
echo $a
echo $b
[hadoop1@hadoop1 test]$ ./s.sh
[hadoop1@hadoop1 test]$ awk '{a=(a""$1" ");b=(b""$2" ")}END{print a"\n"b}' s.txt |awk '{a=(a""$1" ");b=(b""$2" ");c=(c""$3" ");d=(d""$4" ")}END{print a"\n"b"\n"c"\n"d}'
job salary
c++ 13
java 14
php 12
12、打印每一行出现的数字个数
[hadoop1@hadoop1 test]$ awk -F"[1-5]" '{print "line"NR " " "number:"NF-1;sum+=(NF-1)}END{print "sum is "sum"}' nowcoder.txt
BEGIN{
sum=0
}
{
print "line"NR " " "number:"NF-1
sum+=(NF-1)
}
END{
print "sum is "sum
}
[hadoop1@hadoop1 test]$ awk -F"[1-5]" -f nowcoder.awk nowcoder.txt
13、去掉所有包含this的句子
[hadoop1@hadoop1 test]$ grep -v 'this' nowcoder.txt
[hadoop1@hadoop1 test]$ sed -n '/this/!p' nowcoder.txt
[hadoop1@hadoop1 test]$ awk '$0!~/this/{print $0}' nowcoder.txt
14、求平均值
[hadoop1@hadoop1 test]$ awk 'NR>=2{sum+=$1}END{printf "%.3f\n",sum/(NR-1)}' nowcoder.txt
[hadoop1@hadoop1 test]$ awk 'NR==1{N=$1}NR>=2{sum+=$1}END{printf "%.3f\n",sum/N}' nowcoder.txt
15、去掉不需要的单词
- 去掉输入中的含有B和b的单词。输入格式:一行一个单词;输出格式 :将所有单词放入一行中
[hadoop1@hadoop1 test]$ grep -v '[Bb]' s.txt
nowcoder
test
[hadoop1@hadoop1 test]$ sed -n '/[Bb]/!p' s.txt
nowcoder
test
[hadoop1@hadoop1 test]$ awk '$0!~/[Bb]/{a=a""$0" "}END{print a}' s.txt
nowcoder test
16、判断输入的是否为IP地址
- 写一个脚本统计文件nowcoder.txt中的每一行是否是正确的IP地址。
如果是正确的IP地址输出:yes;如果是错误的IP地址,四段号码的话输出:no,否则的话输出:error
- 思路: 以“.”分割ip;ip地址四个段范围都是在0—255间的;若没有四段号码,则为error;若有四段号码但四个值不在[0,255]之间,则为no;否则为yes。
#!/bin/awk -f
{
if(NF!=4)
print "error"
elif (($1>=0&&$1<=255) && ($2>=0&&$2<=255) && ($3>=0&&$3<=255) && ($4>=0&&$4<=255))
print "yes"
else
print "no"
}
[hadoop1@hadoop1 test]$ awk -F"." -f a.awk nowcoder.txt
17、将字段逆序输出文件的每行
- 将字段逆序输出文件nowcoder.txt的每一行,其中每一字段都是用英文冒号: 相分隔。
#!/bin/awk -f
{
for(i=NF;i>=1;i--){
if (i==1){
print $1
break;
}
printf($i":")
}
}
18、域名进行计数排序处理
- 假设我们有一些域名,存储在nowcoder.txt里,现在需要你写一个脚本,将域名取出并根据域名进行计数排序处理。网址:http://www.nowcoder.com/index.html;域名:www.nowcoder.com
[hadoop1@hadoop1 test]$ awk -F"/" '{array[$3]++}END{for (i in array) print array[i],i}' s.txt | sort -rnk1
19、打印等腰三角形
[hadoop1@hadoop1 test]$ awk '{
for(i=5;i>0;i--){
str="";
for(j=i-1;j>0;j--) str=str OFS;
for(j=0;j<6-i;j++) str=str "*" OFS;
print str;
}
}'
20、打印只有一个数字的行
[hadoop1@hadoop1 test]$ awk -F "[0-9]" '(NF==2||NF==0){print $0}' nowcoder.txt
21、格式化输出
[hadoop1@hadoop1 test]$ cat s.txt | xargs -n1 printf "%'d\n"
22、处理文本
[hadoop1@hadoop1 test]$ awk -F ":" '{
res[$1] = (res[$1] == "" ? $2 : (res[$1] "\n" $2))
}END{
for(k in res){
print "["k"]"
print res[k]
}
}' nowcoder.txt
23、nginx日志分析1-IP统计
- 现在需要你统计出2020年4月23号的访问ip次数,并且按照次数降序排序。
- 日志样式:192.168.1.20 - - [21/Apr/2020:14:27:49 +0800] “GET /1/index.php HTTP/1.1” 404 490 “-” “Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0”
- 输出格式: 5 192.168.1.22 (次数 ip)
[hadoop1@hadoop1 test]$ awk '/(23\/Apr\/2020)/{array[$1]++}END{for(i in array) print(array[i],i)}' nowcoder.txt | sort -rnk1
24、nginx日志分析2-统计某个时间段的IP
- 现在你需要统计2020年04月23日20-23点的去重IP访问量
- 思路:范围筛选时间,利用数组对ip分组计数达到去重效果,最后输出数组长度
- 小问题:20—23点包含23点整吗? 不包含的话正则就可以到22ok了 否则还还要匹配23:00:00
[hadoop1@hadoop1 test]$ awk '/(23\/Apr\/2020:20)/,/(23\/Apr\/2020:22)/{array[$1]++}END{print(length(array))}' nowcoder.txt
[hadoop1@hadoop1 test]$ awk -r '/(23\/Apr\/2020:20)/,/(23\/Apr\/2020:22)/{print($1)}' nowcoder.txt | sort |uniq | wc -l
25、nginx日志分析3-统计访问3次以上的IP
[hadoop1@hadoop1 test]$ awk '{array[$1]++}END{for(i in array)if(array[i]>3)print(array[i],i)}' nowcoder.txt | sort -rnk1
26、nginx日志分析4-查询某个IP的详细访问情况
- 需要你查询192.168.1.22的详细访问情况,按访问频率降序排序
- 输出格式:4 /1/index.php (次数 网址)
[hadoop1@hadoop1 test]$ awk '/192.168.1.22/{array[$7]++}END{for(i in array)print(array[i],i)}' nowcoder.txt|sort -rnk1
27、nginx日志分析5-统计爬虫抓取404的次数
- 需要你统计百度爬虫抓取404的次数
- 思路:两个条件 :百度和404
[hadoop1@hadoop1 test]$ awk '/http:\/\/www.baidu.com/&&$9==404' nowcoder.txt | wc -l
[hadoop1@hadoop1 test]$ grep -E 'http:\/\/www.baidu.com' nowcoder.txt | grep '404' | wc -l
[hadoop1@hadoop1 test]$ sed -n '/http:\/\/www.baidu.com/{/404/p}' nowcoder.txt | wc -l
[hadoop1@hadoop1 test]$ grep -E 'http:\/\/www.baidu.com' nowcoder.txt | grep -c '404'
28、nginx日志分析6-统计每分钟的请求数
- 现在需要你统计每分钟的请求数,并且按照请求数降序排序
[hadoop1@hadoop1 test]$ sed -r 's/^.*[0-9]{4}:([0-9]{2}:[0-9]{2}):[0-9]{2}.*$/\1/g' nowcoder.txt | awk '{array[$1]++}END{for(i in array)print(array[i],i)}' | sort -rnk1
[hadoop1@hadoop1 test]$ awk -F":" 'a=$2":"$3{array[a]++}END{for(i in array)print(array[i],i)}' nowcoder.txt | sort -rnk1
29、netstat练习1-查看各个状态的连接数
- 需要你查看系统tcp连接中各个状态的连接数,并且按照连接数降序输出
awk '$1=="tcp"{array[$6]++}END{for(i in array)print(i,array[i])}' nowcoder.txt | sort -rnk2
30、netstat练习2-查看和3306端口建立的连接
- 需要你查看和本机3306端口建立连接并且状态是established的所有IP,按照连接数降序排序
[hadoop1@hadoop1 test]$ cat nowcoder.txt |grep '3306.*ESTABLISHED'| awk '{print $5}'| awk -F":" '{array[$1]++}END{for(i in array)print(array[i],i)}'|sort -rnk1
31、netstat练习3-输出每个IP的连接数
awk '$1=="tcp"{print $5}' nowcoder.txt|awk -F: '{array[$1]++}END{for(i in array)print(i,array[i])}' | sort -rnk2
32、netstat练习4-输出和3306端口建立连接总的各个状态的数目
- 输入格式:tcp 0 0 172.16.56.200:41856 172.16.34.144:3306 ESTABLISHED
- 输出格式:TOTAL_IP 3 \n ESTABLISHED 20 \n TOTAL_LINK 20
- 思路:输出的是ip数,state总数及各个state数 只需第五列和第六列即可,同时将这两列按:分割输出;按:分割数据产生3列(ip 端口 state),分别对ip和state数组分组计数;最后简单计算循环输出即可
awk '$5~/3306/{print $5":"$6}' nowcoder.txt|awk -F"[:]+"
'
{ip[$1]++;state[$3]++}
END{
{print("TOTAL_IP",length(ip))}
for (i in state)
print(i,state[i])
for (i in ip)
sum+=ip[i]
print("TOTAL_LINK",sum)
}
'
33、业务分析-提取值
awk -F "[:,]" '{
if($0~"Server version"){
print "serverVersion:" $4;
}
if($0~"Server number"){
print "serverName:" $4;
}
if($0~"OS Name"){
print "osName:" $4;
}
if($0~"OS Version"){
print "osVersion:" $6
}
}'
34、ps分析-统计VSZ,RSS各自总和
[hadoop1@hadoop1 test]$ awk
'NR>1
{vsz_sum+=$5;rss_sum+=$6}
END{
print("MEM TOTAL" "\n" "VSZ_SUM:" vsz_sum/1024"M" ",RSS_SUM:" rss_sum/1024"M")
}
' nowcoder.txt