标签:style blog http 使用 os io strong 文件
原文:http://blog.hexu.org/archives/41.shtml#id2874788
BEGIN 模块后紧跟着动作块,这个动作块在awk处理任何输入文件之前执行。所以它可以在没有任何输入的情况下进行测试。它通常用来改变内建变量的值,如OFS, RS和FS等,以及打印标题。如:$ awk ‘BEGIN{FS=”:”; OFS=”\t”; ORS=”\n\n”}{print $1,$2,$3} test。上式表示,在处理输入文件以前,域分隔符(FS)被设为冒号,输出文件分隔符(OFS)被设置为制表符,输出记录分隔符(ORS)被设置为两个 换行符。$ awk ‘BEGIN{print “TITLE TEST”}只打印标题。
END不匹配任何的输入文件,但是执行动作块中的所有动作,它在整个输入文件处理完成后被执行。如$ awk ‘END{print “The number of records is” NR}’ test,上式将打印所有被处理的记录数。
$ awk ‘BEGIN{“date” | getline d; split(d,mon); print mon[2]}’ test。执行shell的date命令,并通过管道输出给getline,然后getline从管道中读取并将输入赋值给d,split函数把变量d转 化成数组mon,然后打印数组mon的第二个元素。
$ awk ‘BEGIN{while( “ls” | getline) print}’,命令ls的输出传递给geline作为输入,循环使getline从ls的输出中读取一行,并把它打印到屏幕。这里没有输入文件,因为 BEGIN块在打开输入文件前执行,所以可以忽略输入文件。
$ awk ‘BEGIN{printf “What is your name?”; getline name < “/dev/tty” } $1 ~name {print “Found” name on line “, NR “.”} END{print “See you,” name “.”} test。在屏幕上打印”What is your name?”,并等待用户应答。当一行输入完毕后,getline函数从终端接收该行输入,并把它储存在自定义变量name中。如果第一个域匹配变量 name的值,print函数就被执行,END块打印See you和name的值。
$ awk ‘BEGIN{while (getline < “/etc/passwd” > 0) lc++; print lc}’。awk将逐行读取文件/etc/passwd的内容,在到达文件末尾前,计数器lc一直增加,当到末尾时,打印lc的值。注意,如果文件不存 在,getline返回-1,如果到达文件的末尾就返回0,如果读到一行,就返回1,所以命令 while (getline < “/etc/passwd”)在文件不存在的情况下将陷入无限循环,因为返回-1表示逻辑真。
awk中的条件语句是从C语言中借鉴过来的,可控制程序的流程。
|
格式:
{if (expression){
statement; statement; ...
}
}
|
$ awk ‘{if ($1 <$2) print $2 “too high”}’ test。如果第一个域小于第二个域则打印。
$ awk ‘{if ($1 < $2) {count++; print “ok”}}’ test.如果第一个域小于第二个域,则count加一,并打印ok。
|
格式:
{if (expression){
statement; statement; ...
}
else{
statement; statement; ...
}
}
|
$ awk ‘{if ($1 > 100) print $1 “bad” ; else print “ok”}’ test。如果$1大于100则打印$1 bad,否则打印ok。
$ awk ‘{if ($1 > 100){ count++; print $1} else {count–; print $2}’ test。如果$1大于100,则count加一,并打印$1,否则count减一,并打印$1。
|
格式:
{if (expression){
statement; statement; ...
}
else if (expression){
statement; statement; ...
}
else if (expression){
statement; statement; ...
}
else {
statement; statement; ...
}
}
|
1
2
3
4
|
{for ( x=3; x<=NF; x++)
if ($x<0){print "Bottomed out!"; break}}
{for ( x=3; x<=NF; x++)
if ($x==0){print "Get next item"; continue}}
|
1
2
3
|
{if ($1 ~/test/){next}
else {print}
}
|
awk中的数组的下标可以是数字和字母,称为关联数组。
1
2
3
4
|
{for (item in arrayname){
print arrayname[item]
}
}
|
1
2
|
sub (regular expression, substitution string):
sub (regular expression, substitution string, target string)
|
1
2
|
$ awk ‘{ sub(/test/, "mytest"); print }‘ testfile
$ awk ‘{ sub(/test/, "mytest"); $1}; print }‘ testfile
|
第二个例子在整个记录的第一个域中进行匹配,替换只发生在第一次匹配发生的时候。
1
2
|
gsub (regular expression, substitution string)
gsub (regular expression, substitution string, target string)
|
实例:
1
2
|
$ awk ‘{ gsub(/test/, "mytest"); print }‘ testfile
$ awk ‘{ gsub(/test/, "mytest"), $1 }; print }‘ testfile
|
第一个例子在整个文档中匹配test,匹配的都被替换成mytest。
第二个例子在整个文档的第一个域中匹配,所有匹配的都被替换成mytest。
1
|
index(string, substring)
|
实例:
1
|
$ awk ‘{ print index("test", "mytest") }‘ testfile
|
实例返回test在mytest的位置,结果应该是3。
1
2
|
length( string )
length
|
实例:
1
2
|
$ awk ‘{ print length( "test" ) }‘
$ awk ‘{ print length }‘ testfile
|
第一个实例返回test字符串的长度。
第二个实例返回testfile文件中第条记录的字符数。
1
2
|
substr( string, starting position )
substr( string, starting position, length of string )
|
实例:
1
|
$ awk ‘{ print substr( "hello world", 7,11 ) }‘
|
上例截取了world子字符串。
1
|
match( string, regular expression )
|
实例:
1
2
|
$ 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)。
1
2
|
toupper( string )
tolower( string )
|
实例:
1
|
$ awk ‘{ print toupper("test"), tolower("TEST") }‘
|
1
2
|
split( string, array, field separator )
split( string, array )
|
实例:
1
|
$ awk ‘{ split( "20:18:00", time, ":" ); print time[2] }‘
|
上例把时间按冒号分割到time数组内,并显示第二个数组元素18。
1
|
systime()
|
实例:
1
|
$ awk ‘{ now = systime(); print now }‘
|
1
|
systime( [format specification][,timestamp] )
|
格式 | 描述 |
---|---|
%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 }’
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的随机数 |
在awk中还可自定义函数,格式如下:
1
2
3
4
|
function name ( parameter, parameter, parameter, ... ) {
statements
return expression # the return statement and expression are optional
}
|
【转载更新】Linux工具之AWK 3.高级知识,布布扣,bubuko.com
标签:style blog http 使用 os io strong 文件
原文地址:http://www.cnblogs.com/tango-dg/p/3920965.html