awk -F"分隔符" "command" filename awk -F":" '{print $1}' /etc/passwd
字段引用:
$1代表第一列; $2代表第二列; $0代表所有列。
内置变量:
FS 代表输入的分隔符,等同于-F OFS 代表输出的分隔符 NF 代表字段数,因为NF是列数,所以$NF代表最后一列 NR 代表当前处理第几行
关系操作符:
== 等于 != 不等于 > 大于 < 小于 >= 大于等于 <= 小于等于
逻辑操作符
&& 逻辑与,类似于shell的[ 条件1 -a 条件2 ] || 逻辑或,类似于shell的[ 条件1 -0 条件2 ] ! 非
运算符
+ - * /
^或** 幂
awk可以运算浮点数
echo $[1.2*3] #错误 echo | awk '{print 1.2*3}' #正确
练习
截取所有开放监听的TCP协议端口号 netstat -ntl | awk 'NR>2 {print $4}' |awk -F: '{print $NF}' /etc/passwd文件 截取前五行的倒数第二列 awk -F: 'NR<=5 {print $(NF-1)}' /etc/passwd 打印第五行 awk -F: 'NR==5 {print $0}' /etc/passwd 打印第五行第五列 awk -F: 'NR==5 {print $5}' /etc/passwd awk -F: '{if (NR==5) print $5}' /etc/passwd 打印第五行和第六行 awk -F: 'NR==5 || NR==6 {print $0}' /etc/passwd awk -F: 'NR>=5 && NR<=6 {print $0}' /etc/passwd 打印每行的列数 awk -F: '{print "第"NR"行有"NF"列"}' /etc/passwd 打印奇数行,并加上行号 awk 'NR%2==1 {print NR,$0}' /etc/passwd
截取IP地址,-F后[.:]表示以.或:做分隔符
ifconfig |grep Bcast|awk -F[.:] '{print $2}'
时间可以直接比较
cat test.txt A 2016-11-15 19:20:12 B 2016-11-15 18:12:31 C 2016-11-15 17:58:59 找出18:30之前的记录 awk '$3<"18:30:00" {print $0}' test.txt 注:时间必须写成09:00:00,不能写成9:00:00
BEGIN和END
awk -F: 'BEGIN{处理文件前执行的代码块,可以用于赋值或者打印首行表头} {处理文件过程中的代码块,行处理} END{处理文件后的代码块}' file
printf格式化输出
%s 代表字符串 %d 代表十进制数字 ls -l /etc |awk 'NR>1 {print $5,$NF}' ls -l /etc |awk 'NR>1 {printf("%d %s ",$5,$NF)}' 结果同上 ls -l /etc |awk 'NR>1 {printf("%4d %s ",$5,$NF)}' $5保留4位 ls -l /etc |awk 'NR>1 {printf("%04d %s ",$5,$NF)}' $5保留4位,不足4位用0补齐
字符匹配
== 完全精确匹配 ~ 匹配 !~ 不匹配 != 不相等 awk -F: '$1=="root" {print $0}' /etc/passwd
awk -F: '$1~"oo" {print $0}' /etc/passwd
awk -F: '$1!~"oo" {print $0}' /etc/passwd
字符串函数
长度函数length() echo 12345| wc -L echo 12345| awk '{print length($0)}' 大小写转换 toupper() 转大写 tolower() 转小写 awk -F: '{print tolower(toupper($1))}' /etc/passwd 位置函数index() awk '$0~"ss" {print index()$0,"ss"}' /etc/passwd 算出ss在那一行的字符位置 截取函数substr() awk -F: '{print substr($1,1,2)}' /etc/passwd 把$1从第一个字符起,截取2个字符 echo 123456789ss987654321 | awk '{print substr($0,index($0,"ss"),4)}' 结果:ss98