Linux运维必备的技能:SHELL三剑客awk、sed、grep
时间:2024-12-27 11:41 作者:Anglei 分类: Linux
一、Awk、Sed、Grep分析Nginx日志
1.在Linux服务器系统上日志种类很多:内核日志、安全日志、审计日志、邮件日志、应用程序(Nginx、MYSQL、Redis、MQ、ZK)日志等。日志内容主要是用于排错、定位问题和故障的,还可以对日志内容进行分析、统计,进而可以评估网站的访问量、IP、UV、PV、用户行为的分析等。
2.基于SHELL编程三剑客awk、sed、grep分析Nginx日志,首先通过find工具去查找Nginx日志文件的位置。操作的方法和指令如下:
#查找Linux系统上以.log结尾的日志文件的位置;
find / -name "*.log"
#查找Linux系统上以.log结尾的日志文件,以access开头的;
find / -name "access*.log"
find / -name "*.log" -a -name "access*"
#查找Linux系统上以.log结尾的日志文件,以access开头的,排除access.log文件;
find / -name "*.log" -a -name "access*" -a ! -name access.log
#查找Linux系统上以.log结尾的日志文件,以access开头的,排除access.log文件,文件修改时间是60天之前的;
find / -name "*.log" -a -name "access*" -a ! -name access.log -a -mtime +60
#查找Linux系统上以.log结尾的日志文件,以access开头的,排除access.log文件,文件修改时间是60天之前的,文件大小超过200M的;
find / -name "*.log" -a -name "access*" -a ! -name access.log -a -mtime +60 -a -size +200M
#查找Linux系统上以.log结尾的日志文件,以access开头的,排除access.log文件,文件修改时间是60天之前的,文件大小超过200M的,并且将其拷贝至/tmp/目录;
for i in $(find / -name "*.log" -a -name "access*" -a ! -name access.log -a -mtime +60 -a -size +200M);do \cp $i /tmp/ ;done
find / -name "*.log" -a -name "access*" -a ! -name access.log -a -mtime +60 -a -size +200M -exec \cp {} /tmp/ \;
find / -name "*.log" -a -name "access*" -a ! -name access.log -a -mtime +60 -a -size +200M |xargs -I {} \cp {} /tmp/
3.Nginx WEB日志分析实战一,基于SHELL编程三剑客awk、sed、grep分析Nginx日志,分析、统计Nginx日志全天总的请求数(访问量),操作的方法和指令如下:
awk '{print $0}' access_20240523.log |wc -l
cat access_20240523.log |wc -l
wc -l < access_20240523.log
sed = access_20240523.log |tail -2|awk 'NR==1 {print $0}'
grep -aicwE " " access_20240523.log
4.Nginx WEB日志分析实战二,基于SHELL编程三剑客awk、sed、grep分析Nginx日志,分析、统计Nginx日志10:00-11:00之间的总的请求数(访问量),操作的方法和指令如下:
awk '/23\/May\/2024:10:00/' access_20240523.log |wc -l
sed -n '/23\/May\/2024:10:00/p' access_20240523.log |wc -l
grep -aiE '23\/May\/2024:10:00' access_20240523.log |wc -l
sed -n '/23\/May\/2024:10:00/,/23\/May\/2024:11:00/p' access_20240523.log |wc -l
awk '/23\/May\/2024:10:00/,/23\/May\/2024:11:00/' access_20240523.log |wc -l
5.Nginx WEB日志分析实战三,基于SHELL编程三剑客awk、sed、grep分析Nginx日志,分析、统计Nginx日志10:00-11:00之间的总的请求数(访问量),将用户的IP地址打印出来,操作的方法和指令如下:
sed -n '/23\/May\/2024:10:00/,/23\/May\/2024:11:00/p' access_20240523.log |awk '{print $1}'
sed -n '/23\/May\/2024:10:00/,/23\/May\/2024:11:00/p' access_20240523.log |cut -d" " -f1
sed -n '/23\/May\/2024:10:00/,/23\/May\/2024:11:00/p' access_20240523.log |grep -aiowE "([0-9]{1,3}\.){3}[0-9]{1,3}"
6.Nginx WEB日志分析实战四,基于SHELL编程三剑客awk、sed、grep分析Nginx日志,分析、统计Nginx日志10:00-11:00之间的总的请求数(访问量),将用户的IP地址访问排前20名打印出来,操作的方法和指令如下:
sed -n '/23\/May\/2024:10:00/,/23\/May\/2024:11:00/p' access_20240523.log |grep -aiowE "([0-9]{1,3}\.){3}[0-9]{1,3}"|sort -n|uniq -c|sort -nr|awk 'NR<=20 {print $0}'
7.Nginx WEB日志分析实战五,基于SHELL编程三剑客awk、sed、grep分析Nginx日志,分析、统计Nginx日志10:00-11:00之间的总的请求数(访问量),将用户的IP地址访问次数超过5000次加入Linux黑名单,操作的方法和指令如下:
for ip in $(sed -n '/23\/May\/2024:10:00/,/23\/May\/2024:11:00/p' access_20240523.log |grep -aiowE "([0-9]{1,3}\.){3}[0-9]{1,3}"|sort -n|uniq -c|sort -nr|awk '{if(($1>=5000)) {print $2}}');do iptables -t filter -A INPUT -s $ip/32 -m tcp -p tcp --dport 80 -j DROP ;done
iptables -t filter -L -n --line-numbers|grep -aiE "DROP"
二、常用SED工具企业演练案列
-替换jfedu.txt文本中old为new:
sed 's/old/new/g' jfedu.txt
-打印jfedu.txt文本第一行到第三行:
sed -n '1,3p' jfedu.txt
-打印jfedu.txt文本中第一行与最后一行:
sed -n '1p;$p' jfedu.txt
-删除jfedu.txt第一行至第三行、删除匹配行至最后一行:
sed '1,3d' jfedu.txt
sed '/jfedu/,$d' jfedu.txt
-删除jfedu.txt最后6行及删除最后一行:
for i in `seq 1 6`;do sed -i '$d' jfedu.txt ;done
sed '$d' jfedu.txt
-删除jfedu.txt最后一行:
sed '$d' jfedu.txt
三、常用AWK工具企业演练案列
-AWK打印硬盘设备名称,默认以空格为分割:
df -h|awk '{print $1}'
-AWK以空格、冒号、\t、分号为分割:
awk -F '[ :\t;]' '{print $1}' jfedu.txt
-AWK以冒号分割,打印第一列,同时将内容追加到/tmp/awk.log下:
awk -F: '{print $1 >>"/tmp/awk.log"}' jfedu.txt
-打印jfedu.txt文件中的第3行至第5行,NR表示打印行,$0表示文本所有域:
awk 'NR==3,NR==5 {print}' jfedu.txt
awk 'NR==3,NR==5 {print $0}' jfedu.txt
-打印jfedu.txt文件中的第3行至第5行的第一列与最后一列:
awk 'NR==3,NR==5 {print $1,$NF}' jfedu.txt
-打印jfedu.txt文件中,长度大于80的行号:
awk 'length($0)>80 {print NR}' jfedu.txt
-AWK引用Shell变量,使用-v或者双引号+单引号即可:
awk -v STR=hello '{print STR,$NF}' jfedu.txt
STR="hello";echo| awk '{print "'${STR}'";}'
-AWK以冒号切割,打印第一列同时只显示前5行:
cat /etc/passwd|head -5|awk -F: '{print $1}'
awk -F: 'NR>=1&&NR<=5 {print $1}' /etc/passwd
-Awk指定文件jfedu.txt第一列的总和:
cat jfedu.txt |awk '{sum+=$1}END{print sum}'
-AWK NR行号除以2余数为0则跳过该行,继续执行下一行,打印在屏幕:
awk -F: 'NR%2==0 {next} {print NR,$1}' /etc/passwd
-AWK添加自定义字符:
ifconfig ens33|grep "Bcast"|awk '{print "ip_"$2}'
四、常用GREP工具企业演练案列
全面搜索正则表达式(Global search regular expression(RE) ,GREP)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
Unix/Linux的grep家族包括grep、egrep和fgrep,其中egrep和fgrep的命令跟grep有细微的区别,egrep是grep的扩展,支持更多的re元字符, fgrep是fixed grep或fast grep简写,它们把所有的字母都看作单词,正则表达式中的元字符表示其自身的字面意义,不再有其他特殊的含义,一般使用比较少。
目前Linux操作系统默认使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。其语法格式及常用参数详解如下:
grep -[acinv] 'word' Filename
Grep常用参数详解如下:
-a 以文本文件方式搜索;
-c 计算找到的符合行的次数;
-i 忽略大小写;
-n 顺便输出行号;
-v 反向选择,即显示不包含匹配文本的所有行;
-h 查询多文件时不显示文件名;
-l 查询多文件时只输出包含匹配字符的文件名;
-s 不显示不存在或无匹配文本的错误信息;
-w 仅匹配关键词词组行;
-o 仅匹配&显示匹配的关键词;
-A 匹配关键词之后的N行;
-B 匹配关键词之前的N行;
-C 匹配关键词前后N行;
-E 允许使用egrep扩展模式匹配。
举例说明:
grep -c "test" jfedu.txt 统计test字符总行数;
grep -i "TEST" jfedu.txt 不区分大小写查找TEST所有的行;
grep -n "test" jfedu.txt 打印test的行及行号;
grep -v "test" jfedu.txt 不打印test的行;
grep "test[53]" jfedu.txt 以字符test开头,接5或者3的行;
grep "^[^test]" jfedu.txt 显示输出行首不是test的行;
grep "[Mm]ay" jfedu.txt 匹配M或m开头的行;
grep "K…D" jfedu.txt 匹配K,三个任意字符,紧接D的行;
grep "[A-Z][9]D" jfedu.txt 匹配大写字母,紧跟9D的字符行;
grep "T\{2,\}" jfedu.txt 打印字符T字符连续出现2次以上的行;
grep "T\{4,6\}" jfedu.txt 打印字符T字符连续出现4次及6次的行;
grep -n "^$" jfedu.txt 打印空行的所在的行号;
grep -vE "#|^$" jfedu.txt 不匹配文件中的#和空行;
grep --color -ra -E "db|config|sql" * 匹配包含db或者config或者sql的文件;
grep --color -E "\<([0-9]{1,3}\.){3}([0-9]{1,3})\>" jfedu.txt 匹配IPV4地址。
以上文章来自京峰教育吴光科老师。

推荐阅读:
![]() 路过(0) |
![]() 雷人(0) |
![]() 握手(0) |
![]() 鲜花(0) |
![]() 鸡蛋(0) |