awk使用规则
awk 是一种很棒的语言。awk 适合于文本处理和报表生成,它还有许多精心设计的特性,允许进行需要特殊技巧程序设计。与某些语言不同,awk 的语法较为常见。它借鉴了某些语言的一些精华部分,如 C 语言、python 和 bash(虽然在技术上,awk 比 python 和 bash 早创建)。awk 是那种一旦学会了就会成为您战略编码库的主要部分的语言。
第一个 awk
让我们继续,开始使用 awk,以了解其工作原理。在命令行中输入以下命令:
$ awk '{ print }' /etc/passwd
您将会见到 /etc/passwd 文件的内容出现在眼前。现在,解释 awk 做了些什么。调用 awk 时,我们指定 /etc/passwd 作为输入文件。执行 awk 时,它依次对 /etc/passwd 中的每一行执行 print 命令。所有输出都发送到 stdout,所得到的结果与与执行catting /etc/passwd完全相同。
现在,解释 { print } 代码块。在 awk 中,花括号用于将几块代码组合到一起,这一点类似于 C 语言。在代码块中只有一条 print 命令。在 awk 中,如果只出现 print 命令,那么将打印当前行的全部内容。
      这里是另一个 awk 示例,它的作用与上例完全相同:
              $ awk '{ print $0 }' /etc/passwd
在 awk 中,$0 变量表示整个当前行,所以 print 和 print $0 的作用完全一样。
如果您愿意,可以创建一个 awk 程序,让它输出与输入数据完全无关的数据。以下是一个示例:
$ awk '{ print "" }' /etc/passwd
只要将 "" 字符串传递给 print 命令,它就会打印空白行。如果测试该脚本,将会发现对于 /etc/passwd 文件中的每一行,awk 都输出一个空白行。再次说明, awk 对输入文件中的每一行都执行这个脚本。以下是另一个示例:
$ awk '{ print "hiya" }' /etc/passwd
运行这个脚本将在您的屏幕上写满 hiya。:)
awk的内建函数
    14.8.1. 字符串函数
sub函数匹配记录中最大、最靠左边的子字符串的正则表达式,并用替换字符串替换这些字符串。如果没有指定目标字符串就默认使用整个记录。替换只发生在第一次匹配的时候。格式如下:
            sub (regular expression, substitution string):
            sub (regular expression, substitution string, target string)
实例:
            $ awk '{ sub(/test/, "mytest"); print }' testfile
            $ awk '{ sub(/test/, "mytest"); $1}; print }' testfile
第一个例子在整个记录中匹配,替换只发生在第一次匹配发生的时候。如要在整个文件中进行匹配需要用到gsub
第二个例子在整个记录的第一个域中进行匹配,替换只发生在第一次匹配发生的时候。
gsub函数作用如sub,但它在整个文档中进行匹配。格式如下:
            gsub (regular expression, substitution string)
            gsub (regular expression, substitution string, target string)
实例:
            $ awk '{ gsub(/test/, "mytest"); print }' testfile
            $ awk '{ gsub(/test/, "mytest"), $1 }; print }' testfile
第一个例子在整个文档中匹配test,匹配的都被替换成mytest。
第二个例子在整个文档的第一个域中匹配,所有匹配的都被替换成mytest。
index函数返回子字符串第一次被匹配的位置,偏移量从位置1开始。格式如下:
          index(string, substring)
实例:
$ awk '{ print index("test", "mytest") }' testfile
实例返回test在mytest的位置,结果应该是3。
length函数返回记录的字符数。格式如下:
            length( string )
            length
实例:
            $ awk '{ print length( "test" ) }'
            $ awk '{ print length }' testfile
第一个实例返回test字符串的长度。
第二个实例返回testfile文件中第条记录的字符数。
substr函数返回从位置1开始的子字符串,如果指定长度超过实际长度,就返回整个字符串。格式如下:
            substr( string, starting position )
            substr( string, starting position, length of string )
实例:
            $ awk '{ print substr( "hello world", 7,11 ) }'
上例截取了world子字符串。
match函数返回在字符串中正则表达式位置的索引,如果不到指定的正则表达式则返回0。match函数会设置内建变量RSTART为字符串中子字符串的开始位置,RLENGTH为到子字符串末尾的字符个数。substr可利于这些变量来截取字符串。函数格式如下:
            match( string, regular expression )
实例:
$ awk '{start=match("this is a test",/[a-z]+$/); print start}'
$ awk '{start=match("this is a test",/[a-z]+$/); print start, RSTART, RLENGTH }'
第一个实例打印以连续小写字符结尾的开始位置,这里是11。
第二个实例还打印RSTART和RLENGTH变量,这里是11(start),11(RSTART),4(RLENGTH)。
toupper和tolower函数可用于字符串大小间的转换,该功能只在gawk中有效。格式如下:
            toupper( string )
            tolower( string )
实例:
$ awk '{ print toupper("test"), tolower("TEST") }'
split函数可按给定的分隔符把字符串分割为一个数组。如果分隔符没提供,则按当前FS值进行分割。格式如下:
            split( string, array, field separator )
            split( string, array )
实例:
            $ awk '{ split( "20:18:00", time, ":" ); print time[2] }'
上例把时间按冒号分割到time数组内,并显示第二个数组元素18。

14.8.2. 时间函数
systime函数返回从1970年1月1日开始到当前时间(不计闰年)的整秒数。格式如下:
systime()
实例:
$ awk '{ now = systime(); print now }'
strftime函数使用C库中的strftime函数格式化时间。格式如下:
systime( [format specification][,timestamp] )
 
Table 3. 日期和时间格式说明符
字符串长度规则
格式
描述
%a
星期几的缩写(Sun)
%A
星期几的完整写法(Sunday)
%b
月名的缩写(Oct)
%B
月名的完整写法(October)
%c
本地日期和时间
%d
十进制日期
%D
日期 08/20/99
%e
日期,如果只有一位会补上一个空格
%H
用十进制表示24小时格式的小时
%I
用十进制表示12小时格式的小时
%j
从1月1日起一年中的第几天
%m
十进制表示的月份
%M
十进制表示的分钟
%p
12小时表示法(AM/PM)
%S
十进制表示的秒
%U
十进制表示的一年中的第几个星期(星期天作为一个星期的开始)
%w
十进制表示的星期几(星期天是0)
%W
十进制表示的一年中的第几个星期(星期一作为一个星期的开始)
%x
重新设置本地日期(08/20/99)
%X
重新设置本地时间(12:00:00)
%y
两位数字表示的年(99)
%Y
当前月份
%Z
时区(PDT)
%%
百分号(%)
实例:
            $ awk '{ now=strftime( "%D", systime() ); print now }'
            $ awk '{ now=strftime("%m/%d/%y"); print now }'
    14.8.3. 内建数学函数
Table 4.
函数名称
返回值
atan2(x,y)
y,x范围内的余切
cos(x)
余弦函数
exp(x)
求幂
int(x)
取整
log(x)
自然对数
rand()
随机数
sin(x)
正弦
sqrt(x)
平方根
srand(x)
x是rand()函数的种子
int(x)
取整,过程没有舍入
rand()
产生一个大于等于0而小于1的随机数
 
    14.8.4. 自定义函数
在awk中还可自定义函数,格式如下:
function name ( parameter, parameter, parameter, ... ) {
      statements
      return expression                  # the return statement and expression are optional
}
多个字段
awk 非常善于处理分成多个逻辑字段的文本,而且让您可以毫不费力地引用 awk 脚本中每个独立的字段。以下脚本将打印出您的系统上所有用户帐户的列表:
$ awk -F":" '{ print $1 }' /etc/passwd
上例中,在调用 awk 时,使用 -F 选项来指定 ":" 作为字段分隔符。awk 处理 print $1 命令时,它会打印出在输入文件中每一行中出现的第一个字段。以下是另一个示例:
$ awk -F":" '{ print $1 $3 }' /etc/passwd
以下是该脚本输出的摘录:
halt7
operator11
root0
shutdown6
sync5
bin1

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。