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\n",$5,$NF)}' 结果同上
ls -l /etc |awk 'NR>1 {printf("%4d %s\n",$5,$NF)}' $5保留4位
ls -l /etc |awk 'NR>1 {printf("%04d %s\n",$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