shell讲解--awk

来源:互联网 发布:网络电视无线路由器 编辑:程序博客网 时间:2024/06/06 15:38
本章内容有:
•  抽取域。
•  匹配正则表达式。
•  比较域。
•  向a w k传递参数。

•  基本的a w k行操作和脚本

9.1  调用awk
有三种方式调用a w k,第一种是命令行方式,如:

$ awk [-F field-separator] 'commands' input-file
这里,c o m m a n d s是真正的a w k命令。本章将经常使用这种方法

9.2.1  模式和动作
任何a w k语句都由模式和动作组成。在一个 a w k脚本中可能有许多语句。模式部分决定动
作语句何时触发及触发事件。处理即对数据进行的操作。如果省略模式部分,动作将时刻保
持执行状态。
模式可以是任何条件语句或复合语句或正则表达式。模式包括两个特殊字段 B E G I N和
E N D。使用B E G I N语句设置计数和打印头。 B E G I N语句使用在任何文本浏览动作之前,之后
文本浏览动作依据输入文件开始执行。 E N D语句用来在 a w k完成文本浏览动作后打印输出文
本总数和结尾状态标志。如果不特别指明模式, a w k总是匹配或打印行数。
实际动作在大括号 { }内指明。动作大多数用来打印,但是还有些更长的代码诸如 i f 和循环
(l o o p i n g)语句及循环退出结构。如果不指明采取动作, a w k将打印出所有浏览出来的记录

9.2.2  域和记录

为打印一个域或所有域,使用 p r i n t命令。这是一个a w k动作(动作语法用圆括号括起来)

$ awk '{print $1,$4}'  text.txt

注意,此处是单引号,不能是双引号

打印报告头

awk -F" " 'BEGIN {print "name \t name\n-------------"} {print $3,$4}' awk.txt

awk -F" " 'BEGIN {print "name  name\n-------------"}{print $3,$4} END {print "this is end"}' awk.txt

当第一次使用 a w k时,可能被错误信息搅得不知所措,但通过长时间和不断的学习,可总
结出以下规则。在碰到 a w k错误时,可相应查找:
•  确保整个a w k命令用单引号括起来。
•  确保命令内所有引号成对出现。
•  确保用花括号括起动作语句,用圆括号括起条件语句。
•  可能忘记使用花括号,也许你认为没有必要,但 a w k不这样认为,将按之解释语法

9.2.4  元字符
这里是 a w k中正则表达式匹配操作中经常用到的字符,详细情况请参阅本书第 7章正则表
达式概述。
\ ^ $ . [] | () * + ?
这里有两个字符第 7章没有讲到,因为它们只适用于 a w k而不适用于 g r e p或s e d。它们是:
+ 使用+匹配一个或多个字符。
? 匹配模式出现频率。例如使用 /X Y?Z/ 匹配X Y Z或Y Z

1.  匹配
为使一域号匹配正则表达式,使用符号‘~’后紧跟正则表达式,也可以用 i f语句。 a w k
中i f 后面的条件用()括起来。

$ awk '{if($1~/rw/)print $0}' awk.txt 

匹配记录找到时,如果不特别声明, a w k缺省打印整条记录

 $ awk '$0~/rw/' awk.txt 

上面只是一个命令,所以不需要用{}。如果是一条语句,需要用{}

为精确匹配 ,使用等号 = =,并用单引号括起条件

 $ awk '{if($2=="1")print $0}' awk.txt

3.  不匹配


有时要浏览信息并抽取不匹配操作的记录,与 ~ 相反的符号是 !
~
,意即不匹配

其他关系符一样,不讲述

设置大小写

$ awk -F" " '/[Ww]angkjun/' awk.txt 

$ awk -F" " '$0~/[Ww]angkjun/' awk.txt  

8.  任意字符

使用.

$awk -F" " '$0~/^.........x/' awk.txt  

第一行的最后一个字符是x



9.2.7 NF、NR和FILENAME

要快速查看记录个数,应使用 N R

$ awk -F" " 'END {print NR}' awk.txt 

要快速查看域数,应使用NF

$awk -F" " '{print NF "\t" NR "\t" $0}' awk.txt 

N F的一个强大功能是将变量 $ P W D的返回值传入a w k并显示其目录。这里需要指定域分隔
符/。

$ pwd

/usr/local/etc

$ echo $PWD |awk -F/ '{print $NF}'

另一个例子是显示文件名。

$ echo "/usr/local/etc/rc.sybase" | awk -F/ "{print $NF}"

rc.sybase

1.  设置输入域到域变量名
在a w k中,设置有意义的域名是一种好习惯,在进行模式匹配或关系操作时更容易理解。
一般的变量名设置方式为 n a m e = $ n,这里n a m e为调用的域变量名, n为实际域号。例如设置学
生域名为n a m e,级别域名为 b e l t,操作为 n a m e = $ 1 ; b e l t s = $ 4。注意分号的使用,它分隔 a w k命
令。下面例子中,重新赋值学生名域为 n a m e,级别域为 b e l t s。查询级别为 Ye l l o w的记录,并
最终打印名称和级别。





原创粉丝点击