首页 > 代码库 > 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) |
%p | 12小时表示法(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命令之进阶篇
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。