awk中的模式匹配

awk中的模式匹配在awk程序命令中非常重要,它决定着被处理数据文件中到底哪一行需要处理,并且做出什么样的处理。

首先,我们先看awk命令的基本语法:awk pattern { actions }   注意:pattern就是指的匹配模式,大括号外加两端空格的是处理动作。

上面awk后面的匹配模式和处理行为至少得有一个,不能两个同时缺失。例如,上篇博文中awk { print }   就表示只做输出到屏幕的处理动作,由于没有匹配模式,那么所有行都需要被输出。

实际上,我们在使用awk的时候,大部分情况都要指定匹配模式,那么设计awk程序中的匹配模式一般有如下6种方式。

1. 关系表达式

awk可以支持许多关系运算符,例如>, <, ==等。对于数据文件,我们经常需要把比较关系作为匹配模式。

#-----------------------------/chapter11/ex11-4.sh------------------
#! /bin/bash

#打印第2列的成绩超过80的行
result=`awk '$2 > 80 { print }' scores.txt`

echo "$result"

分析:1)使用shell脚本的方式,只不过在程序中用到awk;2)变量result后面加了反引号``,还记得《变量》那篇中讲的单引号、双引号、反引号的区别吗?这边用到了反引号是因为一定要先执行里面的内容;3)反引号中就是awk程序部分,按照了awk pattern { actions }  的形式,不过一定要注意,pattern { actions
}一定要用单引号括起来,防止被理解成shell语言
,括起来就会被解释成awk语言了。最后是被处理文件scores.txt;4)$2是awk中的变量,表示被处理数据文件的第2列。

2. 正则表达式

匹配方式和上面一致,不过pattern是基于正则表达式的,一般涉及到数据文件中的字符串匹配。

#-----------------------------/chapter11/ex11-5.sh------------------
#! /bin/bash

#输出以字符T开头的行
result=`awk '/^T/ { print }' scores.txt`

echo "$result"
#-----------------------------/chapter11/ex11-6.sh------------------
#! /bin/bash

#输出以Tom或者Kon开头的行
result=`awk '/^(Tom|Kon)/ { print }' scores.txt`

echo "$result"

分析:正则表达式做为匹配模式,一定要把表达式放在两条斜线之间,/regular_expression/。

上面的正则表达式就是选出T开头的或者是Tom或Kon开头的行。

3. 混合模式

混合模式就是把关系表达式和正则表达式结合起来,可以使用&&, ||, !来连接,不过它们都需要在单引号以内。

#-----------------------------/chapter11/ex11-7.sh------------------
#! /bin/bash

#混合模式
result=`awk '/^K/ && $2 > 80 { print }' scores.txt`

echo "$result"

输出以K开头的行,同时第2列分数大于80分的行。

4. 区间模式

用于匹配一段连续的文本行。语法为:awk ‘pattern1, pattern2 { actions }‘ processed datafile

#-----------------------------/chapter11/ex11-8.sh------------------
#! /bin/bash

#区间模式
result=`awk '/^Nancy/, $2==92 { print }' scores.txt`

echo "$result"

区间为:以Nancy开头的行为起始,第2列等于92分的行为终止,输出之间的连续的行。注意:当满足patter1或者pattern2的行不只一行的时候,会自动选择第一个符合要求的行。

5. BEGIN模式

一种特殊的内置模式,不需要指定被处理数据文件,直接输出用户设置的内容。在awk中的生命周期只是执行一次。

#-----------------------------/chapter11/ex11-9.sh------------------
#! /bin/awk -f

#通过BEGIN模式输出字符串
BEGIN { print "Hello! World." }

6. END模式

和BEGIN模式正好相反,它是在awk处理完所有数据文件之后,即将退出程序时成立,在此之前END模式不成立。BEGIN模式也是如此!

#-----------------------------/chapter11/ex11-11.sh------------------
#! /bin/awk -f

#输出报表头
BEGIN {
   print "scores report"
   print "================================="
}

#输出数据
{ print }

#报表完成
END {
   print "================================"
   print "printing is over"
}

参考:Shell从入门到精通

时间: 2024-10-05 23:46:57

awk中的模式匹配的相关文章

awk中使用shell变量

其实在awk里,是不能直接使用shell变量的 方法是:awk -v 选项让awk 里使用shell变量 TIME=60 awk -v time="$TIME" 'BEGIN{FS="|"} {if ($7>time) print $2 }' 这样要注意:在awk里,time不能加$符号. 网上说如下方法都可行: 一:"'$var'" 这种写法大家无需改变用'括起awk程序的习惯,是老外常用的写法.如: var="test&quo

awk中匹配shell变量字符

遇到问题: 现在有两个脚本,我想 将file1中的内容按file2来匹配 [[email protected] home]# cat file1 3-1-1 POTV=1,POTA=0,POTP=2 1-4-76 POTV=1,POTA=0,POTP=1 2-1-2 POTV=1,POTA=1,POTP=1 3-1-4 POTV=1,POTA=1,POTP=2 4-1-5 POTV=1,POTA=1,POTP=2 7-1-2 POTV=1,POTA=1,POTP=2 3-1-10 POTV=1,

awk中可以使用system来执行复杂的shell命令

在awk中可以直接执行shell命令. [plain] view plain copy [email protected]:~$ touch a [email protected]:~$ touch b [email protected]:~$ cat a.txt a b [email protected]:~$ awk '{cmd="rm "$0;system(cmd)}' a.txt [email protected]:~$ ls a.txt      dd            

在awk中通过system调用sql语句来说明引号的使用

一个实际应用例子: 在awk中,通过system调用连接数据库并作select操作,select语句中where条件来自于一个文件(file)的第一个域($1). $ cat file ... 1001 1002 1003 1004 ... 1. 用awk实现: awk '{system("mysql -u root -proot mydatabase -Bse \"select id,name from tables where id=""\047"$1

awk中split函数的用法

The awk function split(s,a,sep) splits a string s into an awk array a using the delimiter sep. time=12:34:56 echo $time | awk '{split($0,a,":" ); print a[1]}' 12   echo $time | awk '{split($0,a,":" ); print a[3]}' 34   echo $time | awk

AWK中for循环调用数组解释

以前对于awk中的for循环调用数组一直不是很清晰,通过这个例子你将会对这种方法非常明白. #!/bin/sh echo"" | awk ' BEGIN { a[1]="123" a[2]="456" a[3]="789" } END{ for(i in a) { print i,a[i] } }' 结果:

bash 参数替换中的模式匹配

参数替换中的模式匹配 # 和## 从字符串的左边开始,并且去掉左边的字符串, % 和 %% 从字符串的右边开始,并且去掉右边的子串. 例如 name=hello lhhs "root" name=${name#'"'}; name=${name%'"'} 结果为root ################################Start Script####################################### 1 #!/bin/bash 2

perl脚本中的模式匹配

#判断一个变量是否匹配一个空字符串,m!pattern! 与 m/pattern/if($str =~ m!^\s*$!)如果仅仅判断字符串为空,可以使用if($str eq "")# 判断$doc变量是否与给定模式相匹配,模式字符串包含<span id="status">字符,\s表示包含空白,[^<>]*表示匹配不为字符<及>的任何字符.# 其中的括号按顺序可以用$1, $2...进行引用. 最后的s表示跨行匹配,g表示全局匹

Shell、Awk 中自动隐式类型转换的“坑”

1.问题: 在林林总总的编程语言里,弱类型的语言着实不少,一方面这种"动态类型"用起来很方便,而另一方面则"坑"你没商量~ 常见的 SQL.Shell.Awk 都会遇到各种暗藏的"隐式类型转换",下面就列举一些 shell.awk 里的自动隐式类型转换 case,防止掉坑. 注意 shell.awk 的变量为空 字符串.变量为空 未定义.初始值的隐式转换问题: # shell 下的字典排序比较 [email protected] 10:59:23