1.介绍
awk
是一种编程语言,用于在 linux/unix
下对文本和数据进行扫描与处理。数据可以来自标准输入、文件、管道。awk
分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是 Alfred Aho
、Peter Weinberger
、Brian Kernighan
。- 实际上
awk
有很多种版本,如:awk
、nawk
、mawk
、gawk
、MKS awk
、tawk
… 这其中有开源产品也有商业产品。 - 目前在
Linux
中常用的awk编译器版本有 mawk
,gawk
,其中以 RedHat
为代表使用的是 gawk
,以 Ubuntu
为代表使用的是 mawk
。 gawk
是 GNU Project
的 awk
解释器的开源代码实现。
2.工作原理
awk
逐行扫描文件,从第一行到最后一行,寻找匹配特定模式的行,并在这些行上进行操作;- 命令结构:
awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
3.命令
Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
Usage: awk [POSIX or GNU style options] [--] 'program' file ...
POSIX options: GNU long options: (standard)
-f progfile --file=progfile
-F fs --field-separator=fs
-v var=val --assign=var=val
Short options: GNU long options: (extensions)
-b --characters-as-bytes
-c --traditional
-C --copyright
-d[file] --dump-variables[=file]
-D[file] --debug[=file]
-e 'program-text' --source='program-text'
-E file --exec=file
-g --gen-pot
-h --help
-i includefile --include=includefile
-l library --load=library
-L[fatal|invalid] --lint[=fatal|invalid]
-M --bignum
-N --use-lc-numeric
-n --non-decimal-data
-o[file] --pretty-print[=file]
-O --optimize
-p[file] --profile[=file]
-P --posix
-r --re-interval
-S --sandbox
-t --lint-old
-V --version
To report bugs, see node `Bugs' in `gawk.info', which is
section `Reporting Problems and Bugs' in the printed version.
gawk is a pattern scanning and processing language.
By default it reads standard input and writes standard output.
Examples:
gawk '{ sum += $1 }; END { print sum }' file
gawk -F: '{ print $1 }' /etc/passwd
4.内置变量
ARGC 命令行参数个数
FILENAME 当前输入文档的名称
FNR 当前输入文档的当前记录编号,尤其当有多个输入文档时有用
NR 输入流的当前记录编号
NF 当前记录的字段个数
FS 字段分隔符
OFS 输出字段分隔符,默认为空格
ORS 输出记录分隔符,默认为换行符\n
RS 输入记录分隔符,默认为换行符\n
5.使用
awk的数据字段变量:
$0表示整行文本
$1表示文本中第一个数据字段
$2表示文本中第二个数据字段
$n表示文本中第n个数据字段
awk的用-F来指定分隔符
默认的字段分隔符是任意空白字符(空格或者TAB)
例:awk -F ":" '{print $1,$2}' file_name
awk -F 分隔符 '/模式/{动作}' 输入文件
6.示例
例1:显示每行的字段数目
#awk '{print NF}' /etc/passwd
(默认分隔符是空白,所以字段数大都是1咯)
# awk -F: '{print NF}' /etc/passwd
(指定了分隔符了,就是7咯)
例2:显示每行的第一字段和最后一个字段
#awk '{print $1,$NF}' /etc/passwd
例3:显示每行的行号和内容
#awk -F: '{print NR,$0}' /etc/passwd
例4:显示第一列和第七列,中间用—隔开
#awk -F: 'BEGIN{OFS="---"}{print $1,$7}' /etc/passwd
简单写法:
#awk -F: 'OFS="---"{print $1,$7}'/etc/passwd
例5:显示符合模式的用户名和所在的行号最后显示总行号:
#awk 'BEGIN{FS=":"}/bash$/{print NR,$1}END{print NR}' /etc/passwd
例6:显示文件的3到5行(带行号,带内容)
#awk‘NR==3,NR==5{print NR,$0}’ /etc/passwd
显示4或7行(带行号,带内容):
#awk 'NR==4||NR==7{print NR,$0}' /etc/passwd
例7:显示文件的前10行(带行号,带内容):
#awk 'NR<=10{print NR,$0}' /etc/passwd
例8:显示文件的前10行和30到40行:
# awk 'NR<=10||NR>30&&NR<=40{print NR,$0}' /etc/passwd