awk命令入门
什么是awk?
AWK是一个强大的文本处理工具。可以使用awk读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
使用awk的基本格式
awk [options] ‘command’ file(s)
command 由pattern和action两部分组成
command 的格式 为 pattern {action}
1. pattern可以是正则表达式或者关系表达式
2. action 包含两部分:
(1). 内置函数
print printf getline 等
(2). 控制指令
if else while
awk options配置选项
- -F filed-separator(分割符,默认为空格)
例子:
#打印所有用户的用户名、UID、GID
#内置变量$1 $3 $4的使用可以参考下面的awk内置变量的说明及
awk -F ':' '{printf "USER:%-20s UID:%10i GID:%10i\n",$1,$3,$4}' /etc/passwd
awk内置变量
- $0: 表示当前行
- $1: 表示每行的第一个字段
- $2: 表示每行的第二个字段
- ….
- *$n: 表示每行的第三个字段
- NR: 每行的行号
- NF: 每行的字段数
例子:
#在上一个例子的基础上添加行号、文件名、字段数
awk -F ':' '{printf "LineNUmber:%5i | USER:%-20s | UID:%10i | GID:%10i | FILENAME:%10s|NF:%10i\n",NR,$1,$3,$4,FILENAME,NF}' /etc/passwd
awk逻辑判断式
awk 中的逻辑判断式可以是正则表达式或者关系表达式
~,!~:正则表达式
例子: 打印m开头的用户名
$awk -F ':' '$1~/^m.*/{print $1}' /etc/passwd
对正则表达式取反,输出正则表达式匹配行的补集
$awk -F ':' '$1!~/^m.*/{print $1}' /etc/passwd
==,!=,<,>: 逻辑表达式
例子: 判断UID的大小,输出UID大于100的用户名和UID
$awk -F ':' '$3>100{print $1,$3}' /etc/passwd
例子:输出UID不等于100的用户名和UID
$awk -F ':' '$3 != 100{print $1,$3}' /etc/passwd
awk BEGIN代码块、END代码块
BEGIN{command1}pattern{command2}END{command3}
例子 :在开始添加表头,在结尾添加表尾
awk -F ':' 'BEGIN{print "LineNum TotalColNum User UID"}{print NR,NF,$1,$3}END{print "-----"FILENAME"---------"}' /etc/passwd
awk使用实例
- 统计当前目录文件总和
ls -l|awk 'BEGIN{size=0}{size+=$5}END{print "size is "size/1024/1024"M"}'
- 统计用户数
awk -F ':' 'BEGIN{count=0}$1!~/^$/{count++}END{print " count = "count}' /etc/passwd
- 输出UID大于100的用户名以及在输出的行集合中的行号
awk -F ':' 'BEGIN{count=0}{if ($3 >100 ) name[count++]=$1}END{ for (i=0;i<count;i++) print i,name[i]}' /etc/passwd
- 统计每种网络状态的连接的数量
netstat -anp | awk '$6~/CONNECTED|LISTEN/{sum[$6]++}END{for (i in sum) print i,sum[i]}'