awk # 内建常量 FILENAME 当前输入文件的名称 FNR 输入文件的记录数 FS 输入分隔符 NF 当前记录的字段数 NR 工作job中的记录数 OFS 输出字段分割符,默认' ' ORS 输出记录分隔符,默认' ' RS 输入记录分隔符,默认' ' 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=" " 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开头或者结尾的行