«

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地址。

以上文章来自京峰教育吴光科老师。

本文完结,相关标签: 三剑客 awk sed grep

版权所有:Anglei
文章标题:Linux运维必备的技能:SHELL三剑客awk、sed、grep
除非注明,本站文章均为 MAXADA社区知识库 原创,请勿用于任何商业用途。

推荐阅读:

看完后感想如何?

路过(0)

雷人(0)

握手(0)

鲜花(0)

鸡蛋(0)
分享到: