awk:对文档有强大的搜索功能,逐行处理并输出
这里的$1 $2 $3… 是awk内置变量,表示列,空格为默认分隔符,也可以人为指定哪个为分隔符,F指定分隔符
[root@server0 ~]# awk '{print $1,$3}' 222
hello world
welcome beijing
[root@server0 ~]# cat 333
root:x:0:0:root:/root:/bin/bash
-F指定分隔符,以下指定:为分隔符
[root@server0 ~]# awk -F: '{print $5}' 333
root
NR 行 NF 列
常量要引起来,变量不用加
[root@server0 ~]# awk -F[:/] '{pr[root@server0 ~]# awk -F[:/] '{print "当前行有"NF"列"}' 333
[root@server0 ~]# awk -F[:/] '{print "当前行有"NF"列"}' 333
当前行有10列
配合正则的格式,在前面加"//",用于定位行
[root@server0 ~]# awk '/^w/{print NR"行有"NF"列"}' 222
2行有3列
awk流程控制
awk [选项] ‘BEGIN{指令} {指令} END{指令}’ 文件
中间的{指令}是 逐行任务
剩下为BEGIN与END是额外任务,与内容无关
\t相当于tab键,可以自动排版
[root@server0 ~]# awk 'BEGIN{print "asasas"}{print }' 222
asasas
hello the world
welcome to beijing
[root@server0 ~]# awk 'BEGIN{x=0}{x++}END{print x}' 222
2
[root@server0 ~]# awk -F[:] 'BEGIN{x=0;print "User\tUID\tHOME"}{print $1"\t"$3"\t"$6 x++}END{print "Toal:" x }' 333
User UID HOME
root 0 /root0
Toal:1
awk处理条件
前面有条件,且输出全部时, "{print}'可以省略
~:代表包含
[root@server0 ~]# awk '/A/' 111
AAA
[root@server0 ~]# awk -F: '$1!~/roo/' /etc/passwd 筛选出第一列不包含"roo"的行
[root@server0 ~]# awk -F: '$7!~/nologin$/{print $1,$2}' /etc/passwd 筛选出第7列不包含nologin$,并输出第一列和第二列的行
使用数值/字符串比较设置条件
[root@server0 ~]# awk 'NR==5' /etc/passwd 输出第5行
[root@server0 ~]# awk -F: '$3==0' /etc/passwd 输出第三列为0的行
[root@server0 ~]# awk -F: '$1=="root"' /etc/passwd 输出第一列为root的行;root默认为变量,需要加引号,变成常量
[root@server0 ~]# awk -F: '$3>=1000' /etc/passwd 输出第三列大于等于1000的行
[root@server0 ~]# awk -F: '$3<=10' /etc/passwd 输出第三列小于等于10的行
使用逻辑符号 && ||
[root@server0 ~]# awk -F: '$3>=1000 || $3<=10' /etc/passwd
[root@server0 ~]# awk -F: '$3>10 && $3<1000' /etc/passwd
[root@server0 ~]# awk 'NR>=2 && NF<=4' /etc/passwd