Shell脚本正则表达式之Awk函数

文章目录

    • 内置函数
      • 内置IO函数
        • getline与next的区别
      • 内置数值函数
      • 内置字符串函数
      • 内置时间函数
    • 用户自定义函数

内置函数

内置IO函数

  • getline函数可以让awk立刻读取下一行数据(读取下一条记录并复制给$0,重新设置NF、NR、FNR)。
  • next函数可以停止处理当前的输入记录,立刻读取下一条记录,并且返回给awk程序的第一个模式匹配重新处理数据。

getline与next的区别

  • getline函数仅仅读取下一条数据,不会影响后续的awk指令的执行。

  • next不仅读取下一行数据,会导致后续指令不再执行,而是重新读取数据后重新回到awk指令的开始位置,重新匹配重新执行动作指令。

  • 操作实例:

#新建素材
vim test.txt
I have a basketball.
I like air jordan sneakers.
I wanna play and do.
How much the T-shirt?
awk '/air/{getline;print "next line:",$0} {print "other line:",$0}' test.txt
awk '/air/{next;print "next line:",$0} {print "other line:",$0}' test.txt
awk '/I/{next;print "next line:",$0} {print "other line:",$0}' test.txt

Shell脚本正则表达式之Awk函数_第1张图片

  • system函数可以直接调用shell命令。awk启动一个新的shell进程执行命令。
  • 操作实例:
awk 'BEGIN{system("ls")}'
awk '{system("echo String:"$0 ">> /tmp/abc.txt")}' test.txt

Shell脚本正则表达式之Awk函数_第2张图片

Tips:
#如果$0不加双引号,结果会是什么?
awk '{system("echo String:$0 > /tmp/abc.txt")}' test.txt

在这里插入图片描述

内置数值函数

#sqrt平方根函数
awk 'BEGIN{print sqrt(64)}'
#int取整函数
awk 'BEGIN{print int(3.1415926)}'
#rand函数0-1之间的随机函数
awk 'BEGIN{print rand()}'
awk 'BEGIN{print 100*rand()}'
awk 'BEGIN{print int(100*rand())}'
awk 'BEGIN{for(i=1;i<=10;i++)print int(100*rand())}'
#srand函数可以使用expr定义新的随机数种子,没有expr时则使用当前系统时间作为随机数种子。
awk 'BEGIN{srand();print rand()}'
awk 'BEGIN{srand(1234);print rand()}'

Shell脚本正则表达式之Awk函数_第3张图片

内置字符串函数

  • length([s])函数可以统计字符串s的长度,如果不指定字符串s则统计$0的长度。
awk 'BEGIN{a="Hello World!";print length(a)}'
awk 'BEGIN{a[0]="Hello World!";a[1]="nihao";a[2]="Ciao";print length(a)}'
awk 'BEGIN{a[0]="Hello World!";a[1]="nihao";a[2]="Ciao";print length(a[2])}'
awk '{print length()}' /etc/hosts

Shell脚本正则表达式之Awk函数_第4张图片

  • index(str1,str2)函数返回字符串2在字符串1中的位置坐标。
awk 'BEGIN{a="Hello World!";print index(a,"e")}'
awk 'BEGIN{a="Hello World!";print index(a,"l")}'
awk 'BEGIN{print index("abcdefg","g")}'

Shell脚本正则表达式之Awk函数_第5张图片

  • match(s,r)函数根据正则表达式r返回字符串。
awk 'BEGIN{print match("Abcdefg12345","[A-Z]")}'
awk 'BEGIN{print match("Abcdefg12345","[a-z]")}'
awk 'BEGIN{print match("Abcdefg12345","[0-9]")}'

Shell脚本正则表达式之Awk函数_第6张图片

  • tolower(str)字符串转换为小写,toupper(str)字符串转换为大写。
awk 'BEGIN{print tolower("Abcdefg12345")}'
awk 'BEGIN{print toupper("Abcdefg12345")}'
awk 'BEGIN{a="Nihao";print tolower(a)}'
awk 'BEGIN{a="Nihao";print toupper(a)}'

Shell脚本正则表达式之Awk函数_第7张图片

  • split(字符串,数组,分隔符)函数可以将字串按特定的分隔符切片后存储在数组里,如果没有指定分隔符,则使用FS定义的分隔符进行字符串切割。
awk 'BEGIN{split("I like playing the piano.",a);print a[4],a[5],a[3],a[2],a[1]}'
awk 'BEGIN{split("I like playing the piano.",a);print a[4]}'
awk 'BEGIN{split("I:like:playing:the:piano.",a,":");print a[1]}'
awk 'BEGIN{split("I1like2playing3football4.",a,"[0-9]");print a[1],a[2]}'

Shell脚本正则表达式之Awk函数_第8张图片
-gsub(r,s,[t])函数默认可以将字符串t中所有正则表达式r匹配字符串全部替换为s,如果没有指定字符串默认为$0进行替换操作。

awk 'BEGIN{a="This is a good instance";gsub("o","O",a);print a}'
cat /etc/passwd |grep ^root |awk '{gsub("[0-9]","##");print $0}'

在这里插入图片描述

  • sub与gsub类似,不过只替换第一个匹配的字符串
awk 'BEGIN{a="This is a good instance";sub("o","O",a);print a}'
cat /etc/passwd |grep ^root |awk '{sub("[0-9]","##");print $0}'

在这里插入图片描述

  • substr(s,a,[n])函数可以对字符串s进行截取,从a位开始,共截取n个字符串,如果没有指定n则一直截取到末尾。
awk 'BEGIN{a="I like learning Shell script.";print substr(a,6)}'
awk 'BEGIN{a="I like learning Shell script.";print substr(a,6,13)}'

在这里插入图片描述

内置时间函数

  • systime()返回的是举例Unix时间戳有多少秒(1970-01-01 00:00:00)。
    在这里插入图片描述

用户自定义函数

  • 语法格式:
function 函数名(参数列表) {命令序列}

-操作实例

awk 'function my() { print "This is a CentOS7."} BEGIN{ my() }'

awk ' \
function max(a,b) { \
if(a>b) {print a} \
else {print b} } \
BEGIN {max(1,2)}'

Shell脚本正则表达式之Awk函数_第9张图片

你可能感兴趣的:(Shell)