shell 阅读笔记-awk简略板
时间:2005-03-03 来源:windguy
第一种是命令行方式,如:
awk -F: 'command' input_file
这里,command是真正的a w k命令。本章将经常使用这种方法。
上面例子中, [ - F域分隔符]是可选的,因为a w k使用空格作为缺省的域分隔符,因此如果要浏览域间有空格的文本,不必指定这个选项
,但如果要浏览诸如passwd文件,此文件各域以冒号作为分隔符,则必须指明- F选项.
第二种方法是将所有awk命令插入一个文件,并使awk程序可执行,然后用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它
第三种方式是将所有的awk命令插入一个单独文件,然后调用:
awk -f awk_script_file input_file
-f选项指明在文件a w k _ s c r i p t _ f i l e中的a w k脚本, i n p u t _ f i l e ( s )是使用a w k进行浏览的文件名。
一 awk
1 有三种方式调用a w k
第一种是命令行方式,如:
awk -F: 'command' input_file
这里,command是真正的a w k命令。本章将经常使用这种方法。
上面例子中, [ - F域分隔符]是可选的,因为a w k使用空格作为缺省的域分隔符,因此如果要浏览域间有空格的文本,不必指定这个选项
,但如果要浏览诸如passwd文件,此文件各域以冒号作为分隔符,则必须指明- F选项.
第二种方法是将所有awk命令插入一个文件,并使awk程序可执行,然后用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它
第三种方式是将所有的awk命令插入一个单独文件,然后调用:
awk -f awk_script_file input_file
-f选项指明在文件a w k _ s c r i p t _ f i l e中的a w k脚本, i n p u t _ f i l e ( s )是使用a w k进行浏览的文件名。
2 域和记录
a w k执行时,其浏览域标记为$ 1,$ 2 . . . $ n。这种方法称为域标识。使用这些域标识将更容易对域进行进一步处理。
使用$ 1 , $ 3表示参照第1和第3域,注意这里用逗号做域分隔。如果希望打印一个有5个域的记录的所有域,不必指明$ 1 , $ 2 , $ 3 ,
$ 4 , $ 5,可使用$ 0,意即所有域。Aw k浏览时,到达一新行,即假定到达包含域的记录末尾,然后执行新记录下一行的读动作,并重
新设置域分隔。
注意执行时不要混淆符号$和s h e l l提示符$,它们是不同的。为打印一个域或所有域,使用p r i n t命令。这是一个a w k动作(
动作语法用圆括号{}括起来)。
3 awk 正则表达式及其 操作
awk条件操作符
< 小于 > = 大于等于
<= 小于等于 ~ 匹配正则表达式
== 等于 !~ 不匹配正则表达式
!= 不等于
4 匹配
为使一域号匹配正则表达式,使用符号‘~’后紧跟正则表达式,也可以用if语句。a w k中if后面的条件用()括起来。
{if($4~/brown/) print $4}意即如果field-4包含brown,打印它。
5 复合表达式
&& AND : 语句两边必须同时匹配为真。
|| O R:语句两边同时或其中一边匹配为真。
! 非求逆
awk '{if($4=="48" && $1="kk")print $0}' input_file
6 awk操作符
在a w k中使用操作符,基本表达式可以划分为数字型、字符串型、变量型、域及数组元素,前面已经讲过一些。下面列出其完整列表。
在表达式中可以使用下述任何一种操作符。
= += *= / = %= ^ = 赋值操作符
? 条件表达操作符
|| && ! 并、与、非(上一节已讲到)
~!~ 匹配操作符,包括匹配和不匹配
< <= == != >> 关系操作符
+ - * / % ^ 算术操作符
++ -- 前缀和后缀
7 内置的字符串函数
awk有许多强大的字符串函数,见表9 - 4。
gsub(r,s) 在整个$ 0中用s替代r
gsub(r,s,t) 在整个t中用s替代r
index(s,t) 返回s中字符串t的第一位置
length(s) 返回s长度
match(s,r) 测试s是否包含匹配r的字符串
split(s,a,fs) 在fs上将s分成序列a
sprint(fmt,exp) 返回经f m t格式化后的e x p
sub(r,s) 用$ 0中最左边最长的子串代替s
substr(s,p) 返回字符串s中从p开始的后缀部分
substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分