工作模式,类似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]}}'
|