1.awk的工作原理
- 逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
- awk倾向于将一行分成多个"字段"然后再进行处理。
- awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。
- 使用awk命令的过程中,可以使用逻辑操作符"&&"表示"与"、"|"表示"或"、"!"表示"非",还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。
2.awk的命令格式
- awk 选项 '模式或条件 {操作}' 文件1 文件2 ....
- 或者
- awk -f 脚本文件 文件1 文件2 .....
- 第一步:执行BEGIN{action;… }语句块中的语句
- 第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ action;… }语句块,它逐行扫描文件,
- 从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
- 第三步:当读至输入流末尾时,执行END{action;…}语句块
- BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中
- END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块
- pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块
3.awk基础命令
3.1过滤出包含指定内容的行
3.2 -F,指定分隔符,取列
3.3 BEGIN
3.4 END
3.5 文件导入,打印内容
3.6 “计算机”
3.7 awk取磁盘量
3.8 awk取IP地址
4. awk 常见的内置变量
awk 选项 '模式{print }'
-
FS :指定每行文本的字段分隔符,缺省默认为空格或制表符(tab)。与 “-F”作用相同 -v "FS=:"
-
OFS:输出时的分隔符
-
NF:当前处理的行的字段个数
-
NR:当前处理的行的行号(序数)
-
$0:当前处理的行的整行内容
-
$n:当前处理行的第n个字段(第n列)
-
FILENAME:被处理的文件名
-
RS:行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n
-v:定义变量 awk 中的变量
-F:指定分隔符
4.1 FS
4.2 OFS
4.3 RS
4.4 NF
4.5 NR
4.6 找普通用户
4.7 FNR
5.自定义变量
printf
%s:显示字符串
%d, %i:显示十进制整数
%f:显示为浮点数
%e, %E:显示科学计数法数值
%c:显示字符的ASCII码
%g, %G:以科学计数法或浮点形式显示数值
%u:无符号整数
%%:显示%自身##############做成一个表格###########################
awk -F: 'BEGIN{printf "--------------------------------\n%-20s|%10s|\n--------------------------------\n","username","uid"}{printf "%-20s|%10d|\n--------------------------------\n",$1,$3}' /etc/passwd
6.模式匹配
awk '模式{处理动作}'
PATTERN:根据pattern条件,过滤匹配的行,再做处
7.找到10:00 到 11:00之间的日志
awk '/10/,/11/' 文件名
sed -nr '/10/,/11/p' 文件名
8.关系表达式
- 关系表达式结果为“真”才会被处理
- 真:结果为非0值,非空字符串
- 假:结果为空字符串或0值
8.1 0为假;1为真
8.2 n++
8.3 !0
8.4 i=!i
8.5 !(i=!i)
9.条件判断
- if语句:awk的if语句也分为单分支、双分支和多分支
- 单分支为if(判断条件){执行语句}
- 双分支为if(判断条件){执行语句}else{执行语句}
- 多分支为if(判断条件){执行语句}else if(判断条件){执行语句}else if(判断条件){执行语句}else if(判断条件){执行语句
if条件判断
10. for
11.访问、赋值数值元素
12.遍历数组
13.小案例
1. awk '!line[$0]++' test
2. 用for循环,打印端口号信息
ss -natp| awk 'NR!=1{print $1}' | sort |uniq -c
ss -natp | awk 'NR!=1{a[$1]++}END{for(i in a)print i,a[i]}'
3. 提取下面的字段中的 IP地址和时间
58.87.87.99 - - [09/Jun/2020:03:42:43 +0800] "POST /wp-cron.php?doing_wp_cron=1591645363.2316548824310302734375 HTTP/1.1" ""sendfileon
128.14.209.154 - - [09/Jun/2020:03:42:43 +0800] "GET / HTTP/1.1" ""sendfileon
64.90.40.100 - - [09/Jun/2020:03:43:11 +0800] "GET /wp-login.php HTTP/1.1"""sendfileo
4. 提取host.txt主机名后再放回host.txt文件
1 www.kgc.com
2 mail.kgc.com
3 ftp.kgc.com
4 linux.kgc.com
5 blog.kgc.com