awk
# 内建常量
FILENAME 当前输入文件的名称
FNR 输入文件的记录数
FS 输入分隔符
NF 当前记录的字段数
NR 工作job中的记录数
OFS 输出字段分割符,默认' '
ORS 输出记录分隔符,默认'\n'
RS 输入记录分隔符,默认'\n'
ARGC 命令行参数的数目。
ARGIND 命令行中当前文件的位置(从0开始算)。
ARGV 包含命令行参数的数组。
CONVFMT 数字转换格式(默认值为%.6g)
ENVIRON 环境变量关联数组。
ERRNO 最后一个系统错误的描述。
FIELDWIDTHS 字段宽度列表(用空格键分隔)。
IGNORECASE 如果为真,则进行忽略大小写的匹配。
OFMT 数字的输出格式(默认值是%.6g)。
RLENGTH 由match函数所匹配的字符串的长度。
RSTART 由match函数所匹配的字符串的第一个位置。
SUBSEP 数组下标分隔符(默认值是\034)。
# 字段引用
$0指当前行
$1,$2,$3...指定记录中的第n个字段,也可指定分隔符
echo 'one two three four' | awk '{ print $1,$2,$3 }'
echo 'one two three four' | awk '{OFS="\n" print $1,$2,$3 }'
# 字符串函数
sub 匹配记录中最大、最靠左边的子字符串的正则表达式,并用替换字符串替换这些字符串。如果没有指定目标字符串就默认使用整个记录。替换只发生在第一次匹配的 时候
gsub 整个文档中进行匹配
index 返回子字符串第一次被匹配的位置,偏移量从位置1开始
substr 返回从位置1开始的子字符串,如果指定长度超过实际长度,就返回整个字符串
split 可按给定的分隔符把字符串分割为一个数组。如果分隔符没提供,则按当前FS值进行分割
length 返回记录的字符数
match 返回在字符串中正则表达式位置的索引,如果找不到指定的正则表达式则返回0。match函数会设置内建变量RSTART为字符串中子字符串的开始位 置,RLENGTH为到子字符串末尾的字符个数。substr可利于这些变量来截取字符串
# 示例:
awk 'NR>19&&NR<31' ett.txt 打印20~30行
awk '{print NR,$0}' /etc/inittab 给目标文件加行号
awk ‘NR==24 {print NR,$0}’ /etc/inittab 输出第24行并且加行号
awk 'BEGIN{RS="[/]+"} NR==2{print NR,$2}' test 以一个或多个/为行的分割符,打印第二行的第二列,列的分隔符为默认的空格,并打印行号
awk -F ":" '$5~/^s/{print $0}' /etc/passwd 以:为分隔符,打印第5列以s开头的一整行
awk -F "/" '$(NF-1)~/(s|)bin/' /etc/passwd 以/为分隔符,匹配倒数第二行的s或者没有s后面是bin的整行
awk '$1~/^(ssh|ftp|mysql)$/{print $1,$2}' /etc/services 匹配第一列以ssh或者ftp或mysql开头或者结尾的行