一、AWK简介
awk:报告生成器,是以行为单位进行处理,并格式化后显示
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
二、AWK变量
2.1 awk内置变量之记录变量
FS: 默认是空白字符,指定输入分隔符 RS: 输入文本信息所使用的换行符 OFS: 输出字符分隔符 ORS: 输出行分隔符
FS or -F [[email protected] ~]# cat test.txt this is a test. [[email protected] ~]# awk -F‘ ‘ ‘{print $0}‘ test.txt FS可以使用-F选项,当没有使用-F选项的时候,awk默认-F选项为空格或者tab this is a test.[[email protected] ~]# awk ‘{print $0}‘ test.txt this is a test.
RS [[email protected] ~]# cat abc1|2|3[[email protected] ~]# awk ‘BEGIN{RS="|"}{print $0}‘ abc 找到"|"符号,将它变成回车123
OFS [[email protected] ~]# cat test.txt this is a test. [[email protected] ~]# awk ‘OFS=":"{print $1,$2,$3,$4}‘ test.txt 将文件的间隔由空格符换成分号 this:is:a:test.
ORS [[email protected] ~]# cat abc 1 2 3 [[email protected] ~]# awk ‘BEGIN{ORS="----\n"}{print $0}‘ abc # 输出分隔符号。 1---- 2---- 3----
2.2 awk内置变量之数据变量
NR: awk命令所处理的记录数 :如果有多个文件,这个数目会把处理的多个文件中行统一计数 FNR:与NR不同的是,FNR用于记录正处理的行是当前这一文件中被总共处理的行数 NF: 当前记录的字段个数
[[email protected] ~]# cat test1 1 2 3 [[email protected] ~]# cat test2 1 2 3 4 5 NR [[email protected] ~]# awk ‘{print NR}‘ test1 test2 # 两个文件行数之和 1 2 3 4 5 6 7 8 FNR [[email protected] ~]# awk ‘{print FNR}‘ test1 test2 # 两个文件的行数分别显示出来 1 2 3 1 2 3 4 5
NF [[email protected] ~]# cat test.txt this is a test. [[email protected] ~]# awk ‘{print NF}‘ test.txt # NF是计算一行中的字段数 4 [[email protected] ~]# awk ‘{print $NF}‘ test.txt # 而$NF则是一行中最后一个字段的简单表示方法 test.
三、printf
printf命令的使用格式:
printf format,item1,item2,...
要点:
1、其与print命令的最大不同是,printf需要指定format;
2、format用于指定后面的每个item的输出格式
3、printf语句不会自动打印换行符;\n
format格式的指定符都以%开头,后跟一个字符,如下:
%c: 显示字符的ASCII码;
%s: 显示字符串
修饰符:
N:显示宽度;
-:左对齐
+:显示数值符号
常见模式类型
1、regexp:正则表达式,格式为/regular expression/
2、expression:表达式,其值非0或为非空字符串时满足条件,如:$1 ~ /foo/ 或 $1 == "magedu",用运算符~(匹配)和!~(不匹配)
3、ranges:指定的匹配范围,格式为part1,part2
4、BEGIN/END:特殊模式,仅在awk命令执行前运行一次或结束前运行一次
5、Empty(空模式):匹配任意输入行
例:取得/etc/passwd中每个用户名和shell格式化显示出来:
[[email protected] ~]# awk -F: ‘{printf "%-10s %-10s\n",$1,$NF}‘ /etc/passwd root /bin/bash bin /sbin/nologin daemon /sbin/nologin adm /sbin/nologin ......
[[email protected] ~]# awk -F: ‘BEGIN{printf "%-10s %-10s\n","User","Shell"}{printf "%-10s %-10s\n",$1,$NF}‘ /etc/passwd User Shell root /bin/bash bin /sbin/nologin daemon /sbin/nologin adm /sbin/nologin lp /sbin/nologin ......
例:获取服务器tcp连接的每种状态数量
[[email protected] ~]# netstat -nat | awk ‘/^tcp/{++S[$NF]}END{for (i in S){print i,S[i]}}‘ ESTABLISHED 3 LISTEN 4
/^tcp/ 正则表达式: 匹配以tcp开头的行
{++S[$NF]} 获取每行的最后一个字节添加到数组,此时的S为数组 $NF为下标
END{for (i in S){print i,S[i]}} 处理完成后,通过下标循环打印出 下标 和 变量值
时间: 2024-10-20 10:30:12