shell——awk

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

 

posted @ 2016-10-28 14:28  沄持的学习记录  阅读(400)  评论(0编辑  收藏  举报