之前我们学习了awk基本入门,我惊喜的发现有awk一篇详细文章,有写念头,不能全部转载,转化成自己的方式来写一些。
主讲内置变量和部分字符串函数
内置变量(有翻译特殊变量和环境变量,按照官方翻译为内置变量)
变量 |
说明 |
$n | 当前记录的第n个字段,字段间由FS分隔。 |
$0 | 完整的输入记录。 |
ARGC | 命令行参数的数目。 |
ARGIND | 命令行中当前文件的位置(从0开始算)。 |
ARGV | 包含命令行参数的数组。 |
BINMODE | 在非POSIX系统上,这个变量指定的所有I / O使用二进制模式 |
CONVFMT | 数字转换格式(默认值为%.6g) |
ENVIRON | 环境变量关联数组。 |
ERRNO | 最后一个系统错误的描述。 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔)。 |
FILENAME | 当前文件名。 |
FNR | 同NR,但相对于当前文件 |
FPAT | 这是一个正则表达式(字符串),告诉gawk基于匹配正则表达式的文本来创建字段 |
FS | 字段分隔符(默认是任何空格)。 |
IGNORECASE | 如果为真,则进行忽略大小写的匹配。 |
LINT | 当这个变量为真(非零或非空),gawk的行为犹如"--lint"命令行选项 |
NF | 当前记录中的字段数。 |
NR | 当前记录数。 |
OFMT | 数字的输出格式(默认值是%.6g)。 |
OFS | 输出字段分隔符(默认值是一个空格)。 |
ORS | 输出记录分隔符(默认值是一个换行符)。 |
PROCINFO | 这个数组的元素提供访问运行awk程序的信息 |
RLENGTH | 由match函数所匹配的字符串的长度。 |
RS | 记录分隔符(默认是一个换行符)。 |
RT | 每次一条记录被读取的设置 |
RSTART | 由match函数所匹配的字符串的第一个位置。 |
SUBSEP |
数组下标分隔符(默认值是\034)。 |
TEXTDOMAIN | 此变量用于程序的国际化 |
蓝色为新增加的内置变量。
简单举例:
1.
- sed 1q /etc/passwd | awk '{ FS = ":"; print $1 }'
打印密码第一行,用冒号分隔符
2.
- awk 'END{print FILENAME}' awk.txt
打印文本FILENAME
3.
- seq 100 | awk 'NR==4,NR==6'
打印4到6行
再介绍几个awk内置的字符串函数,也讲一部分。
length(string):
返回字符串的长度
index(string,serch_string):
返回search_string在字符串中出现的位置
split(string,array,delimiter):
用定界符生成一个字符串列表,并将该列表存入数组
substr(string,array,delimiter):
在字符串中用字符起止便宜量生成子串,并返回该子串
sub(regex,replacement_str,string):
将正则表达式匹配到的第一处内容替换成replacement_str
gsub(regex,replacement_str,string):
和sub()类似。不过该函数会替换正则表达式匹配到的所有内容
match(regex,string):
检查正则表达式是否能够匹配字符串。如果能够匹配,返回非0值;否则,返回0.match()有两个相关的特殊变量,分别是RSTART喝RLENGTH。变量RSTART包含正则表达式所匹配内容的其实位置,而变量RLENGTH包含正则表达式所匹配内容的长度。
举例:
1.
- $ awk '{ sub(/test/, "mytest"); print }' testfile
在整个记录中匹配,替换只发生在第一次匹配发生的时候
2.
- $ awk '{ sub(/test/, "mytest"); $1}; print }' testfile
在整个记录的第一个域中进行匹配,替换只发生在第一次匹配发生的时候
3.
- $ awk '{ print index("test", "mytest") }' testfile
实例返回test在mytest的位置,结果应该是3
4.
- $ awk '{ print length( "test" ) }'
实例返回test字符串的长度。