awk笔记

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开头或者结尾的行

 

posted @ 2018-10-25 11:47  Mars.wang  阅读(172)  评论(0编辑  收藏  举报