首页 > 代码库 > awk命令之进阶篇

awk命令之进阶篇

内置函数


数学函数

atan2(y,x)计算y/x的反正切
cos(x)计算x的余弦;x是弧度
sin(x)计算x的正弦;x是弧度
exp(x)计算e的x幂
log(x)计算x的自然对数
sqrt(x)计算x平方根
int(x)计算x的截断至整数的值
rand()返回一个随机数,范围0~1,小于1
srand(x)设置rand函数的种子值,省略参数则使用时间作为参数。返回先前的种子值

awk'BEGIN{printexp(1)}'
2.71828
awk'BEGIN{printsqrt(25)}'
5
awk'BEGIN{printlog(exp(1))}'
1
awk'BEGIN{printint(5.5)}'
5
没有使用srand时,rand的随机数每次都一样
awk'BEGIN{printrand()}'
0.237788
awk'BEGIN{printrand()}'
0.237788
使用srand后,每次都不一样
awk'BEGIN{srand();printrand()}'
0.110823
awk'BEGIN{srand();printrand()}'
0.681478

字符串函数

gsub(pattern,des,src)由des替换src所有被pattern匹配的字符串
sub(pattern,des,src)用des替换src中被pattern匹配的第一个字符串。函数返回替换的数量。如果未指定src参数,缺省值是整个记录($0)
index(str1,Str2)str2中的字符串出现在str1中的从1开始的位置。若没有则返回0
length(str)返回str参数指定的字符串的长度(字符形式)。如果未给出str参数,则返回整个记录的长度($0)
substr(str,ptr,n)返回字符串s中从ptr开始长度为n的字符串,如果未指定n,则返回ptr指定的位置到str参数的末尾的字符串
match(str,pattern)返回在str中匹配pattern的开始位置,并设置RLENGTH变量为匹配个数。无匹配时RLENGTH为-1
split(str,array,[pattern])将str字符串以pattern为分隔符,分割并存在array数组内。省略pattern时使用默认分隔符
tolower(str)返回str参数指定的字符串,字符串中每个大写字符将更改为小写
toupper(str)返回str参数指定的字符串,字符串中每个小写字符将更改为大写
sprintf(format,expr,expr,...)字符串格式化函数,返回格式化后的字符串

cat tmp.txt
str strstr str

awk '{sub(/str/,"123");print $0}' tmp.txt
123ing strstr str
awk '{gsub(/str/,"123");print $0}' tmp.txt
123ing 123ing123ing 123ing
awk 'BEGIN{print index("1234","23")}'
2
awk 'BEGIN{print length("1234")}'
4
$awk 'BEGIN{print substr("1234",2,2)}'
23
awk 'BEGIN{print substr("1234",2)}'
234
awk 'BEGIN{print match("abcd",/cd/);print RLENGTH}'
3
2
awk 'BEGIN{print match("abcd",/e/);print RLENGTH}'
0
$awk 'BEGIN {split("123;456;789",array,/;/);i=0;for(i in array)print array[i]}'
123
456
789
awk 'BEGIN {print toupper("string");}'
STRING
awk 'BEGIN {print tolower("STRING");}'
string
awk 'BEGIN {a=1;b="string";print sprintf("hello %d hello %s",a,b);}'
hello 1 hello string

其他函数

close(filenameORcommand)关闭打开的文件或管道。成功,则返回 0;其它情况下返回非零值
system(command )执行command参数指定的命令,并返回退出状态。等同于 system 子例程
expression | getline [ variable ] 将expression命令的输出通过管道读入variable,如果当前未打开将 expression管道,则创建管道且是只读管道。只要管道保持打开,则对 getline 函数的每次调用都会读取下一行记录。如果未指定 variable 参数,则 $0 记录变量设置为该记录的值,还将设置 NF、NR 和 FNR 特殊变量
getline [ variable ] < filename从 filename 指定的文件读取下一个记录,并存在 variable 内。只要输入流保持打开且 filename 参数对同一个字符串求值,则对 getline 函数的每次调用都会读取下一行记录。如果未指定 variable 参数,则 $0 记录变量设置为该记录的值,还将设置 NF、NR 和 FNR 特殊变量
getline [ variable ]将 variable 参数指定的变量设置为从当前输入文件读取的下一个输入记录。如果未指定 variable 参数,则 $0 记录变量设置为该记录的值,还将设置 NF、NR 和 FNR 特殊变量
awk 'BEGIN{system("cat tmp.txt")}'
string stringstring string
awk 'BEGIN {"cat ~/tmp.txt"  | getline;print $0;close("cat ~/tmp.txt");}'
string stringstring string
awk 'BEGIN {getline a< "tmp.txt";print a;close("tmp.txt");}'
string stringstring string

mktime("YYYY MM DD HH MM SS") 生成时间格式
strftime([format [, timestamp]])格式化时间输出,将时间戳转为时间字符串 
systime()得到时间戳,返回从1970年1月1日开始到当前时间(不计闰年)的整秒数

awk 'BEGIN{last=mktime("2012 01 02 03 04 05");print strftime("%Y %m %d %H %M %S",last)}'
2012 01 02 03 04 05


格式描述
%a星期几的缩写(Sun)
%A星期几的完整写法(Sunday)
%b月名的缩写(Oct)
%B月名的完整写法(October)
%c本地日期和时间
%d十进制日期
%D 日期 08/20/99
%e日期,如果只有一位会补上一个空格
%H用十进制表示24小时格式的小时
%I用十进制表示12小时格式的小时
%j从1月1日起一年中的第几天
%m 十进制表示的月份
%M十进制表示的分钟
%S十进制表示的秒
%U十进制表示的一年中的第几个星期(星期天作为一个星期的开始)
%w十进制表示的星期几(星期天是0)
%W 十进制表示的一年中的第几个星期(星期一作为一个星期的开始)
%x重新设置本地日期(08/20/99)
%X重新设置本地时间(12:00:00)
%y两位数字表示的年(99)
%Y完整数字表示的年
%Z时区(PDT)
%p12小时表示法(AM/PM)
%%百分号(%)


自定义函数


类似于c语言函数,但参数类型,以及返回值类型。

函数定义以function 开头,可定义在非语句块内的任意位置。

函数调用是可提供0个或多个参数,对于缺少的参数默认值为0或空字符串

通过return关键字可以提前结束函数并返回

函数的参数如果是标量则是传值,数组则是传引用,函数中改变数组的值可以改变全局数组中的值

$0,$1,$2...默认是全部脚本使用,无论在函数内还是函数外,可以认为是全局的
awk '
BEGIN{print max(1,2,3)}
function max(a,b,c)
{
	a=a>b?a:b;
	return a>c?a:c;
}'
3

awk '
BEGIN{print max(1,2,3)}
function max(a,b,c)
{
	a=a>b?a:b;
	return a;
	a>c?a:c;
}'
2

awk '
BEGIN{print max(1,2,3)}
function max(a,b,c)
{
	a=a>b?a:b;
	a>c?a:c;
}'
输出空格


执行方式

命令行方式

awk[option]‘commands‘输入文件

shell脚本方式

将所有的awk命令写在一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行。
相当于shell脚本首行的:#!/bin/sh,可以换成:#!/bin/awk -f


awk -f

将所有的awk命令插入一个单独文件,然后调用:
awk -f awk脚本 输入文件
-f选项加载awk脚本。



include和load


在一个awk脚本内部可以引用另外的awk脚本或库函数

通过关键字include和load来引用
 @include "filename"
 @load "filename"


也可通过-i指定include-file,和通过-l指定load-lib

文件的默认搜索路径由环境变量ENVIRON中的AWKPATH和AWKLIBPATH指定。
awk 'BEGIN{print sprintf("AWKPATH =" ENVIRON["AWKPATH"])}'
AWKPATH =.:/usr/share/awk
awk 'BEGIN{print sprintf("AWKLIBPATH =" ENVIRON["AWKLIBPATH"])}'
AWKLIBPATH =/usr/lib/gawk
在awksrc文件内
cat awksrc
function max(a,b,c)
{
	a=a>b?a:b;
	return a>c?a:c;
}

function min(a,b,c)
{
	a=a<b?a:b;
	return a<c?a:c;
}

cat testawk.awk
#!/bin/awk -f
@include "awksrc"
BEGIN{print "输入3个数字,将输出最大值:"}
{
	print max($1,$2,$3)
};
执行:
./testawk.awk
输入3个数字,将输出最大值:
1 2 3
3



awk命令之进阶篇