本文共 3989 字,大约阅读时间需要 13 分钟。
工作模式,类似cut功能,
与sed区别
1、格式
2、PATTERN
awk基本格式:
awk [OPTION...] 'PATTERN{ACTION STATEMENT;ACTION STATEMENT;...}' FILE1 FILE2 ...
OPTION:
-F '' 指明分隔符
-v var="value" 定义变量
PATTERN:定义读入哪些行时对行处理
ACTION: 对行如何处理,文本格式化输出:print,printf
1 | 多个语句间用 ; |
1、变量
内建变量
自定义变量
变量应用注意
2、ACTION
printf
3、操作符
4、PATTERN定界:'PATTERN{ACTION STATEMENT}'
5、ACTION
5.1 if-else awk取得的行进行字段判断
1 2 | if (condition) { true -statement} 或 if (condition) true -statement if (condition) { true -statement} else { false -statement} |
id号大于1000为普通用户
最后一个字段的行/bin/bash结尾
字段数大于5个,显示行,否则不显示
显示文件系统使用结果>80则显示
1 2 3 | id 号大于1000为普通用户 # awk -F ':' '{if ($3>500){print $1,$3}}' /etc/passwd # awk -F ':' '{if ($3>500){printf "%15s %-d\n",$1,$3}}' /etc/passwd |
1 2 3 | 最后一个字段的行/bin/bash结尾 # awk -F ':' '{if ($NF == "/bin/bash"){print $1,$3}}' /etc/passwd # awk -F ':' '{if ($NF ~ /\<bash$/){print $NF}}' /etc/passwd |
1 2 | 字段数大于 5 个,显示行,否则不显示 # awk -F ':' '{if (NF>5){print $0}}' /etc/passwd |
1 2 | 显示文件系统使用结果> 80 则显示 # df -hP | awk -v FS= "%" '!/^File/{print $1}' | awk '{if ($NF>80){print $1}}' |
5.2 while 对一行内的多个字段逐一处理时使用,对数组中各元素逐一处理时使用
1 2 3 4 5 | while (condition) { true -statement} (condition) 判断条件 { true -statement} 条件为真时,执行循环体 length(arg1,arg2,...) 显示字段的长度 |
对整个一行中的各字段,显示各字段内容和字段中包含的字段的个数
对整个一行中的各字段,字段大于等于10才显示字段内容和字段中包含的字段的个数
对整个一行中的各字段,显示各字段内容和字段中包含的字段的个数
1 2 3 4 | # awk '{i=1;while (i<=NF){print $i,length($i);i++}}' /etc/fstab 思路: awk '{print length($i)}' FILE i表示每个字段即可 |
对整个一行中的各字段,字段大于等于10才显示字段内容和字段中包含的字段的个数
1 2 3 | # awk '{i=1;while (i<=NF){if (length($i)>5)print $i,length($i);i++}}' /etc/fstab 循环嵌套 if 条件判断 |
5.3 do-while循环
1 2 | do { true -statement} while (condition) 至少执行一次循环体 |
1 | # awk '{i=1;do {print $i,length($i);i++} while (i<=NF)}' /etc/issue |
5.4 for 循环
1 2 | for (控制变量初始化;控制变量条件表达式;控制变量的修正表达式) {statement} for ( var iable assignment;condition;iteration process) { for -body} |
对整个一行中的各字段,显示各字段内容和字段中包含的字段的个数
对整个一行中的各字段,字段大于等于10才显示字段内容和字段中包含的字段的个数
对整个一行中的各字段,显示各字段内容和字段中包含的字段的个数
1 2 3 4 5 6 7 8 | 显示模式匹配到的行 # awk '/^[[:space:]]+/{print}' /etc/grub.conf 用I表示每个字段 # awk '/^[[:space:]]+/{print length($i)}' /etc/grub.conf 套入循环格式 ,在循环体中要对I值进行修正 # awk '/^[[:space:]]+/{i=1;while (i<=NF){print $i,length($i);i++}}' /etc/grub.conf |
对整个一行中的各字段,字段大于等于10才显示字段内容和字段中包含的字段的个数
1 2 | 循环体中嵌套单分支 if 语句 ,单分支 if 的statement的{} 可省略 # awk '/^[[:space:]]+/{i=1;while (i<=NF){if (length($i)>=10)print $i,length($i);i++}}' /etc/grub.conf |
5.5 switch语句 多分支if
1 2 | switch (expression) ( case VALUE1 or /REGEXP1/:statement; case VALUE2 or /REGEXP2/:statement;...; default :statemet) 表达式 == value1 或 表达式 ~ /REGEXP1 |
》》》
5.6 break [n] 或 continue
1 2 | 显示奇数字段 # awk -F ':' '{i=1;while (i<=NF){if (i%2==0) {i++;continue} else {print i,$i;i++}}}' /etc/passwd |
5.7 next 提前结束本行处理
1 2 | 显示以/bin/bash结尾的行,非/bin/bash结尾的行next # awk -F ':' '{if ($NF != "/bin/bash"){next} else {print $0}}' /etc/passwd |
1 2 | 显示用户id号为偶数的用户 # awk -F ':' '{if ($3%2 != 0){next} else {print $0}}' /etc/passwd |
6、数组
1 2 | 显示第一个元素 # awk 'BEGIN{weekdays["mon"]="Monday";weekdays["thu"]="Thuseday";print weekdays["mon"]}' |
统计netstat状态
统计日志IP
统计/etc/fstab文件中每个单词出现的次数
统计文件系统出现的次数
1 2 3 4 5 6 | 统计netstat -tnl 中的状态 1 )查看所有状态 netstat -tan | awk '{print $NF}' 2 )# netstat -tan | awk '{state[$NF]++}END{for (i in state){print i,state[i]}}' |
1 2 3 4 5 6 7 8 9 10 | 统计日志 1 )查看httpd是否被安装 rpm -q httpd 2 ) 启动httpd service httpd start 3 )httpd自带压力测试工具,ab ab -c 100 -n 1000 4 )统计日志IP # awk '{count[$1]++}END{for (i in count){print i,count[i]}}' / var /log/httpd/access_log |
1 2 3 | 统计/etc/fstab文件中每个单词出现的次数 # awk '{i=1;while (i<=NF){count[$i]++;i++}}END{for (i in count){print i,count[i]}}' /etc/fstab # awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for (i in count){print i,count[i]}}' /etc/fstab |
1 2 3 | 统计文件系统出现的次数 # awk '{print $3}' /etc/fstab # awk '{count[$3]++}END{for (i in count){print i,count[i]}}' /etc/fstab |
7、函数
统计每一个ip建立ip的个数
1 2 | 统计每一个ip建立ip的个数 # netstat -tnl | awk '!/^Proto/ && !/^Active/{split($5,state,":");ip[state[1]]++}END{for (i in ip){print i,ip[i]}}' |