跳转至

1. 介绍

1. 介绍

awk是一个强大的Linux命令,有强大的文本格式化的能力,好比将一些文本数据格式化成专业的execl表的样式

awk更是一门编程语言,支持条件判断、数组、循环等功能

# 三剑客总结:
    -grep:擅长单纯的查找或匹配文本内容
    -awk:更适合编辑、处理匹配到的文本内容
    -sed:更适合格式化文本内容,对文本进行复杂处理

# 三剑客都是在内存中操作文件,sed可以加-i参数操作原文件,grep和awk可以使用重定向得到结果!

2. 语法

# 语法
awk [option] 'pattern[action]' file 
# action指的是动作,awk擅长文本格式化,且输出格式化后的结果,因此最常用的动作就是print和printf

3. awk内置变量

# 对awk而言,变量分为
    -内置变量
    -自定义变量

# 内置变量  
$n                      指定分隔符后,当前记录的第n个字段
$0                      完整的输入记录
FS                      字段分隔符,默认是空格
NF(number of fields)            分隔后,当前行一共有多少个字段
NR(number of records)           当前记录数,行数

man awk(查看更多内置变量)

FS  输入字段分隔符
OFS 输出字段分隔符
RS  输入记录分隔符,指定输入时的换行符
ORS 输出记录分隔符(输出换行符),输出时用指定符号代替换行符
NF  当前行的字段的个数
NR  当前处理的文本行的行号
FNR 各文件分别计数的行号
FILENAME    当前文件名
ARGC    命令行参数的个数
ARGV    数组,保存的是命令行所给定的各参数

# 内置变量NR、NF不用添加$符号
# 而$0,$1....需要添加$符号!

4. awk参数

-F      指定分隔符
-v      定义或修改一个awk内部变量
-f      从脚本文件中读取awk命令

5. awk格式化

1. print输出

# 前面我们接触到的awk输出是{print},只能对文本简单的输出,并不能美化或者修改格式

2. printf格式化输出

# 如果你学过C语言或者go语言,一定见识过printf()能够对文本格式化输出!

3. printf和print区别

#1. printf与print最大的不同是:printf需要指定format
#2. format用于指定后面的每个item的输出格式
#3. printf语句不会自动打印换行符:\\n

# format格式的指示符都以%开头,后面跟一个字符,如下
%c:显示字符的ASCII码
%d,%i:十进制整数
%e,%E:科学计数法显示数值
%f:显示浮点数
%g,%G:以科学计数法的格式或浮点数的格式显示数值
%s:显示字符串
%u:无符号整数
%%:显示%自身

# printf修饰符:
-:左对齐,默认右对齐
+:显示数值符号,printf "%+d"

# printf默认不添加换行符,
# print默认添加换行符

6. awk模式

#1.空模式
# 没有指定任何的模式(条件),因此每一行都执行了对应的动作,
# 空模式会匹配文档的每一行
awk '{print $1}' nb.txt

#2. 关系运算符模式
# awk默认执行打印输出动作
awk 'NR==2,NR==5' nb.txt

#3. BEGIN/END模式

7. awk使用场景

1.在脚本中格式化输出想要的数据!
awk -F ":" 'BEGIN{printf "%-25s\t %-25s\t %-25s\t %-25s\t %-25s\t %-25s\t %-25s\n","用户名","密码","UID","GID","用户注释","用户家目录","用户使用的解释器"} {printf "%-25s\t %-25s\t %-25s\t %-25s\t %-25s\t %-25s\t %-25s\n",$1,$2,$3,$4,$5,$6,$7}' pwd.txt

2.统计访问日志中IP排序
awk '{print $1}' access.log |sort -n |uniq -c |sort -nr|head -10

3.日志文件中截取想要的日志内容
# awk '/正则1/,/正则2/{动作}' file(类似sed!!!)
awk '/16\/Jan\/2022:11:23:42/,/16\/Jan\/2022:14:25:22/' access.log.1

# 百度找的答案
awk '$4 >="[16/Jan/2022:11:23:42" && $4 <="[16/Jan/2022:14:25:22"' access.log.1
# 截取日志举例
# 访问日志文件
ubuntu@zabbix:/var/log/nginx$ cat access.log.1
91.194.84.88 - - [16/Jan/2022:09:24:33 +0800] "CONNECT dnspod.qcloud.com:443 HTTP/1.1" 400 166 "-" "-"
117.25.148.119 - - [16/Jan/2022:10:14:20 +0800] "\x05\x01\x00" 400 166 "-" "-"
183.60.136.230 - - [16/Jan/2022:10:14:55 +0800] "\x05\x01\x00" 400 166 "-" "-"
117.25.148.119 - - [16/Jan/2022:10:14:57 +0800] "\x05\x01\x00" 400 166 "-" "-"
42.157.194.16 - - [16/Jan/2022:10:15:04 +0800] "\x05\x01\x00" 400 166 "-" "-"
183.60.136.230 - - [16/Jan/2022:10:15:48 +0800] "\x05\x01\x00" 400 166 "-" "-"
42.157.194.16 - - [16/Jan/2022:10:16:07 +0800] "\x05\x01\x00" 400 166 "-" "-"
91.194.84.88 - - [16/Jan/2022:10:24:04 +0800] "CONNECT dnspod.qcloud.com:443 HTTP/1.1" 400 166 "-" "-"
23.224.186.37 - - [16/Jan/2022:10:44:00 +0800] "\x16\x03\x01\x00\xAE\x01\x00\x00\xAA\x03\x03\x9A@L\xFB\x98\xAB\xFB\xA9yZi\x9E[\xC5S\xCC%\xEF9m\xFC#\x00\xB2ph\x1EA\xDA\xD0\xA2\xC2\x00\x00\x1A\xC0/\xC0+\xC0\x11\xC0\x07\xC0\x13\xC0\x09\xC0\x14\xC0" 400 166 "-" "-"
91.194.84.88 - - [16/Jan/2022:11:23:42 +0800] "CONNECT dnspod.qcloud.com:443 HTTP/1.1" 400 166 "-" "-"
91.194.84.88 - - [16/Jan/2022:12:23:53 +0800] "CONNECT dnspod.qcloud.com:443 HTTP/1.1" 400 166 "-" "-"
161.35.151.45 - - [16/Jan/2022:13:08:37 +0800] "" 400 0 "-" "-"
91.194.84.88 - - [16/Jan/2022:13:25:56 +0800] "CONNECT dnspod.qcloud.com:443 HTTP/1.1" 400 166 "-" "-"
39.99.137.22 - - [16/Jan/2022:13:44:19 +0800] "\x16\x03\x01\x02\x00\x01\x00\x01\xFC\x03\x03\x11\xD1\xAE\x0F`W\xAA.\xF7b\xB57\x93m3\x22L\xDD\xDF4'x\xE7t\xD9\x01_\x99]YL" 400 166 "-" "-"
39.99.137.22 - - [16/Jan/2022:13:44:19 +0800] "\x16\x03\x01\x02\x00\x01\x00\x01\xFC\x03\x03\xE4\x92\xE3\x9A\x0C\x1E\x04(\x83%\x1D\x05vM\xC16\xD6tE\x8B\xEF\x066\x0F\x7FNf \x09\x120\xBD\x00\x00\xDA\x00\x05\x00\x04\x00\x02\x00\x01\x00\x16\x003\x009\x00:\x00\x18\x005\x00" 400 166 "-" "-"
91.194.84.88 - - [16/Jan/2022:14:25:22 +0800] "CONNECT dnspod.qcloud.com:443 HTTP/1.1" 400 166 "-" "-"
91.194.84.88 - - [16/Jan/2022:15:25:54 +0800] "CONNECT dnspod.qcloud.com:443 HTTP/1.1" 400 166 "-" "-"
91.194.84.88 - - [16/Jan/2022:16:25:20 +0800] "CONNECT dnspod.qcloud.com:443 HTTP/1.1" 400 166 "-" "-"
222.186.59.201 - - [16/Jan/2022:16:43:23 +0800] "\x16\x03\x01\x00\xEE\x01\x00\x00\xEA\x03\x03\xB7};\xCC\xC4\x86\x08\xB0S" 400 166 "-" "-"
91.194.84.88 - - [16/Jan/2022:17:27:38 +0800] "CONNECT dnspod.qcloud.com:443 HTTP/1.1" 400 166 "-" "-"
91.194.84.88 - - [16/Jan/2022:18:27:40 +0800] "CONNECT dnspod.qcloud.com:443 HTTP/1.1" 400 166 "-" "-"

# 方法1
ubuntu@zabbix:/var/log/nginx$ awk '$4 >="[16/Jan/2022:11:23:42" && $4 <="[16/Jan/2022:14:25:22"' access.log.1
91.194.84.88 - - [16/Jan/2022:11:23:42 +0800] "CONNECT dnspod.qcloud.com:443 HTTP/1.1" 400 166 "-" "-"
91.194.84.88 - - [16/Jan/2022:12:23:53 +0800] "CONNECT dnspod.qcloud.com:443 HTTP/1.1" 400 166 "-" "-"
161.35.151.45 - - [16/Jan/2022:13:08:37 +0800] "" 400 0 "-" "-"
91.194.84.88 - - [16/Jan/2022:13:25:56 +0800] "CONNECT dnspod.qcloud.com:443 HTTP/1.1" 400 166 "-" "-"
39.99.137.22 - - [16/Jan/2022:13:44:19 +0800] "\x16\x03\x01\x02\x00\x01\x00\x01\xFC\x03\x03\x11\xD1\xAE\x0F`W\xAA.\xF7b\xB57\x93m3\x22L\xDD\xDF4'x\xE7t\xD9\x01_\x99]YL" 400 166 "-" "-"
39.99.137.22 - - [16/Jan/2022:13:44:19 +0800] "\x16\x03\x01\x02\x00\x01\x00\x01\xFC\x03\x03\xE4\x92\xE3\x9A\x0C\x1E\x04(\x83%\x1D\x05vM\xC16\xD6tE\x8B\xEF\x066\x0F\x7FNf \x09\x120\xBD\x00\x00\xDA\x00\x05\x00\x04\x00\x02\x00\x01\x00\x16\x003\x009\x00:\x00\x18\x005\x00" 400 166 "-" "-"
91.194.84.88 - - [16/Jan/2022:14:25:22 +0800] "CONNECT dnspod.qcloud.com:443 HTTP/1.1" 400 166 "-" "-"
ubuntu@zabbix:/var/log/nginx$

# 方法2
ubuntu@zabbix:/var/log/nginx$ awk '/16\/Jan\/2022:11:23:42/,/16\/Jan\/2022:14:25:22/' access.log.1
91.194.84.88 - - [16/Jan/2022:11:23:42 +0800] "CONNECT dnspod.qcloud.com:443 HTTP/1.1" 400 166 "-" "-"
91.194.84.88 - - [16/Jan/2022:12:23:53 +0800] "CONNECT dnspod.qcloud.com:443 HTTP/1.1" 400 166 "-" "-"
161.35.151.45 - - [16/Jan/2022:13:08:37 +0800] "" 400 0 "-" "-"
91.194.84.88 - - [16/Jan/2022:13:25:56 +0800] "CONNECT dnspod.qcloud.com:443 HTTP/1.1" 400 166 "-" "-"
39.99.137.22 - - [16/Jan/2022:13:44:19 +0800] "\x16\x03\x01\x02\x00\x01\x00\x01\xFC\x03\x03\x11\xD1\xAE\x0F`W\xAA.\xF7b\xB57\x93m3\x22L\xDD\xDF4'x\xE7t\xD9\x01_\x99]YL" 400 166 "-" "-"
39.99.137.22 - - [16/Jan/2022:13:44:19 +0800] "\x16\x03\x01\x02\x00\x01\x00\x01\xFC\x03\x03\xE4\x92\xE3\x9A\x0C\x1E\x04(\x83%\x1D\x05vM\xC16\xD6tE\x8B\xEF\x066\x0F\x7FNf \x09\x120\xBD\x00\x00\xDA\x00\x05\x00\x04\x00\x02\x00\x01\x00\x16\x003\x009\x00:\x00\x18\x005\x00" 400 166 "-" "-"
91.194.84.88 - - [16/Jan/2022:14:25:22 +0800] "CONNECT dnspod.qcloud.com:443 HTTP/1.1" 400 166 "-" "-"


最后更新: 2022-02-15 13:50:14