awk -h
[root@node0 tmp]# awk -h
Usage: awk [POSIX or GNU style options] -f progfile [--] file ... 从文件中读取程序
Usage: awk [POSIX or GNU style options] [--] 'program' file ... 命令行直接写程序
POSIX options: GNU long options:
-f progfile --file=progfile 从指定的文件中读取程序
-F fs --field-separator=fs 指定字段分隔符,默认是一个或多个空格
-v var=val --assign=var=val 定义gawk程序中的变量及默认值
-m[fr] val
-O --optimize
-W compat --compat
-W copyleft --copyleft
-W copyright --copyright
-W dump-variables[=file] --dump-variables[=file]
-W exec=file --exec=file
-W gen-po --gen-po
-W help --help
-W lint[=fatal] --lint[=fatal]
-W lint-old --lint-old
-W non-decimal-data --non-decimal-data
-W profile[=file] --profile[=file]
-W posix --posix
-W re-interval --re-interval
-W source=program-text --source=program-text
-W traditional --traditional
-W usage --usage
-W use-lc-numeric --use-lc-numeric
-W version --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
示例
1、从命令行读取程序脚本
1.1、一条命令
gawk程序脚本用一对大括号来定义。你必须将脚本命令放到两个大括号中{ }
由于gawk命令行假定脚本是单个文本字符串,还必须将脚本放到单引号中 ' '
数据字段变量:
$0代表整个文本行
$1代表文本行中分隔后的第1个数据字段
$n代表文本行中分隔后的第n个数据字段
在文本行中,每个数据字段都是通过字段分隔符划分的。默认的分隔符是任意的空白字符(空格或制表符)
[root@node0 ~]# cat /etc/passwd |head -n 5
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
[root@node0 ~]# cat /etc/passwd |head -n 5|awk -F ':' '{print $1}' #以:为分隔符,打印第1列
[root@node0 ~]# cat /etc/passwd |head -n 5|awk -F ':' '{print $1" "$7}' #以:为分隔符,打印第1列和第7列
[root@node0 ~]# cat /etc/passwd |head -n 5|awk -F ':' 'BEGIN {print "user shell"} {print $1" "$7} END {print "ending"}' 添加BEGIN和END脚本
将上例中的program写到文件中,BEGIN和END要和{ 在一行
[root@node0 ~]# cat /etc/passwd |head -n 5|awk -F ':' -f format
内置变量
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 分隔后的列数
NR 浏览的行数
建议把FS写到BEGIN里,不然容易出问题
[root@node0 ~]# cat /etc/passwd |head -n 5|awk '{FS=":"; print "row:"NR ",col:" NF",linecontent:"$0}'
row:1,col:1,linecontent:root:x:0:0:root:/root:/bin/bash
row:2,col:7,linecontent:bin:x:1:1:bin:/bin:/sbin/nologin
row:3,col:7,linecontent:daemon:x:2:2:daemon:/sbin:/sbin/nologin
row:4,col:7,linecontent:adm:x:3:4:adm:/var/adm:/sbin/nologin
row:5,col:7,linecontent:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@node0 ~]# cat /etc/passwd |head -n 5|awk 'BEGIN {FS=":"} {print "row:"NR ",col:" NF",linecontent:"$0}'
row:1,col:7,linecontent:root:x:0:0:root:/root:/bin/bash
row:2,col:7,linecontent:bin:x:1:1:bin:/bin:/sbin/nologin
row:3,col:7,linecontent:daemon:x:2:2:daemon:/sbin:/sbin/nologin
row:4,col:7,linecontent:adm:x:3:4:adm:/var/adm:/sbin/nologin
row:5,col:7,linecontent:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin