简介
awk是一个处理文本的编程语言工具,能用简短的程序处理标准输入或文件、数据排序、计算以及生成报表等等。 在Linux系统下默认awk是gawk,它是awk的GNU版本。可以通过命令查看应用的版本:ls -l /bin/awk 基本的命令语法:awk option 'pattern {action}' file 其中pattern表示AWK在数据中查找的内容,而action是在找到匹配内容时所执行的一系列命令。花括号用于根据特定的模式对一系列指令进行分组。 awk处理的工作方式与数据库类似,支持对记录和字段处理,这也是grep和sed不能实现的。 在awk中,缺省的情况下将文本文件中的一行视为一个记录,逐行放到内存中处理,而将一行中的某一部分作为记录中的一个字段。用1,2,3...数字的方式顺序的表示行(记录)中的不同字段。用$后跟数字,引用对应的字段,以逗号分隔,0表示整个行。
选项
选项 | 描述 |
---|---|
-f program-file | 从文件中读取awk程序源文件 |
-F fs | 指定fs为输入字段分隔符 |
-v var=value | 变量赋值 |
--posix | 兼容POSIX正则表达式 |
--dump-variables=[file] | 把awk命令时的全局变量写入文件, 默认文件是awkvars.out |
--profile=[file] | 格式化awk语句到文件,默认是awkprof.out |
模式
常用模式有:
Pattern | Description |
---|---|
BEGIN{ } | 给程序赋予初始状态,先执行的工作 |
END{ } | 程序结束之后执行的一些扫尾工作 |
/regular expression/ | 为每个输入记录匹配正则表达式 |
pattern && pattern | 逻辑and,满足两个模式 |
pattern || pattern | 逻辑or,满足其中一个模式 |
! pattern | 逻辑not,不满足模式 |
pattern1, pattern2 | 范围模式,匹配所有模式1的记录,直到匹配到模式2 |
而动作,就是下面所讲的print、流程控制、I/O语句等。
示例:1)从文件读取awk程序处理文件
# vi test.awk
{print$2}
# tail -n3 /etc/services |awk -f test.awk
48049/tcp
48128/tcp
49000/tcp
2)指定分隔符,打印指定字段
打印第二字段,默认以空格分隔:
# tail -n3 /etc/services |awk '{print $2}'
48049/tcp
48128/tcp
48128/udp
指定冒号为分隔符打印第一字段:
# awk-F ':' '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
......
还可以指定多个分隔符,作为同一个分隔符处理:
# tail -n3 /etc/services |awk -F'[/#]' '{print $3}'
iqobject
iqobject
MatahariBroker
# tail -n3 /etc/services |awk -F'[/#]' '{print $1}'
iqobject 48619
iqobject 48619
matahari 49000
# tail -n3 /etc/services |awk -F'[/#]' '{print $2}'
tcp
udp
tcp
# tail -n3 /etc/services |awk -F'[/#]' '{print $3}'
iqobject
iqobject
MatahariBroker
# tail -n3 /etc/services |awk -F'[ /] ' '{print $2}'
48619
48619
49000
[]元字符的意思是符号其中任意一个字符,也就是说每遇到一个/或#时就分隔一个字段,当用多个分隔符时,就能更方面处理字段了。
3)变量赋值
# awk-v a=123 'BEGIN{print a}'
123
系统变量作为awk变量的值:
#a=123
# awk-v a=$a 'BEGIN{print a}'
123
或使用单引号
# awk'BEGIN{print '$a'}'
123
4)输出awk全局变量到文件
# seq 5|awk --dump-variables '{print $0}'
1
2
3
4
5
# cat awkvars.out
ARGC:number (1)
ARGIND:number (0)
ARGV:array, 1 elements
BINMODE:number (0)
CONVFMT:string ("%.6g")
ERRNO:number (0)
FIELDWIDTHS:string ("")
FILENAME:string ("-")
FNR:number (5)
FS:string (" ")
IGNORECASE:number (0)
LINT:number (0)
NF:number (1)
NR:number (5)
OFMT:string ("%.6g")
OFS:string (" ")
ORS:string ("n")
RLENGTH:number (0)
RS:string ("n")
RSTART:number (0)
RT:string ("n")
SUBSEP:string ("