一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
awk [选项参数] 'pattern1{action1} pattern2{action2}...' filename
pattern:表示AWK在数据中查找的内容,就是匹配模式。action:在找到匹配内容时所执行的一系列命令。
注意:行匹配语句 awk 只能用单引号。单引号内部可以使用双引号,但是顺序不能错。
读入有’\n’换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0
则表示所有域,$1
表示第一个域,$n
表示第n个域,$NF
表示文本行中的最后一个数据字段。默认域分隔符是"空白键" 或 “[tab]键”。
准备数据
[root@jiangnan awk]# cp /etc/passwd ./
[root@jiangnan awk]# cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
...
[root@jiangnan awk]#
[root@jiangnan awk]# awk -F: '/^root/{print $7}' passwd
/bin/bash
[root@jiangnan awk]#
-F,指定分隔符为
:
。print,打印。$7,第7列(域)。
^
在root前,表示以指定字符开头,如果没有,则表示有指定字符的行,位置不限。
[root@jiangnan awk]# awk -F: '/^root/{print $1","$7}' passwd
root,/bin/bash
[root@jiangnan awk]#
注意:只有匹配了pattern的行才会执行action。
[root@jiangnan awk]# awk -v i=1 -F: '{print $3+i}' passwd
1
2
3
4
...
[root@jiangnan awk]#
-v:赋值一个用户定义变量
[root@jiangnan awk]# cat abc
{print $1,$3,$NF}
[root@jiangnan awk]# awk -F : -f abc passwd
root 0 /bin/bash
bin 1 /sbin/nologin
daemon 2 /sbin/nologin
adm 3 /sbin/nologin
lp 4 /sbin/nologin
...
[root@jiangnan awk]#
-f:引入awk执行脚本。
[root@jiangnan awk]# awk -F : 'BEGIN{print "user, shell"} {print $1","$7} END{print "dahaige,/bin/zuishuai"}' passwd
user, shell
root,/bin/bash
bin,/sbin/nologin
...
ntp,/sbin/nologin
dahaige,/bin/zuishuai
[root@jiangnan awk]#
注意:BEGIN 在所有数据读取行之前执行;END 在所有数据执行之后执行。
变量 | 说明 |
---|---|
FILENAME | awk浏览的文件名 |
NR | 已读的记录数 |
NF | 浏览记录的域的个数 |
[root@jiangnan awk]# awk -F: '{print "filename:" FILENAME ", linenumber:" NR ",columns:" NF}' passwd
filename:passwd, linenumber:1,columns:7
filename:passwd, linenumber:2,columns:7
filename:passwd, linenumber:3,columns:7
filename:passwd, linenumber:4,columns:7
...
filename:passwd, linenumber:24,columns:7
[root@jiangnan awk]#
[root@jiangnan awk]# cat sed.txt
1 the quick green fox jumps over the lazy dog.
2 the quick green fox jumps over the lazy dog.
3 the quick green fox jumps over the lazy dog.
4 the quick green fox jumps over the lazy dog.
5 the quick green fox jumps over the lazy dog.
[root@jiangnan awk]# awk '/^$/{print NR}' sed.txt
3
[root@jiangnan awk]#
[root@jiangnan awk]# awk 'NR==3{print $0}' passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@jiangnan awk]#
[root@jiangnan awk]# awk -F: 'NR==5{print $6}' passwd
/var/spool/lpd
[root@jiangnan awk]#
[root@jiangnan awk]# awk -F: '$1=="root"{print $0}' passwd
root:x:0:0:root:/root:/bin/bash
[root@jiangnan awk]#
以上案例要注意需要指定切割符
:
[root@jiangnan awk]# head -2 /proc/meminfo | awk 'NR==1{a=$2}NR==2{b=$2;print (a-b)*100/a "%"}'
95.6707%
[root@jiangnan awk]#
BEGIN是优先级最高的代码块,是在执行PROGRAM之前执行的,不需要提供数据源,因为不涉及到任何数据的处理,也不依赖与PROGRAM代码块;PROGRAM是对数据流干什么,是必选代码块,也是默认代码块。所以在执行时必须提供数据源;END是处理完数据流后的操作,如果需要执行END代码块,就必须需要PROGRAM的支持,单个无法执行。
总结起来awk程序运行优先级是:
[root@jiangnan awk]# awk 'BEGIN{print "hello ayitula"}{print $0}END{print "bye ayitula"}' sed.txt
hello ayitula
1 the quick green fox jumps over the lazy dog.
2 the quick green fox jumps over the lazy dog.
3 the quick green fox jumps over the lazy dog.
4 the quick green fox jumps over the lazy dog.
5 the quick green fox jumps over the lazy dog.
bye ayitula
[root@jiangnan awk]#
[root@jiangnan awk]# awk 'BEGIN{print "hello world"}'
hello world
[root@jiangnan awk]#
可以看出BEGIN不需要数据源(sed.txt)就可以执行。
[root@jiangnan awk]# awk 'END{print "hello world"}'
END没有数据源则无法执行。
点击下方微信公众号,获取更多内容。