分类: LINUX
2009-07-11 17:55:45
1.print函数
例子1:
$ date
$ date|awk '{print "Date:" $1 "\nTime:" $3}'
Date:
Time:19时34分24秒
注意,用date命令查看时间格式。不同的语言可能格式也不一样,因此 awk也要随之而变\n是转义序列,表示换行符。常见转义序列如下表: 转义序列用一个反斜杠后跟一个字母或者数字表示
转义序列 |
含义 |
\b |
退格 |
\f |
换页 |
\n |
换行 |
\t |
制表符(空格) |
\r |
回车 |
例子2:
$ awk '/Sally/{print "\t\tHave a nice day, "$1,$2 "\!"}' employees
Have a nice day, Sally Chang!
解释:如果包含模式Sally,则print函数打印两个跳格,串Have a nice day,第一个字段和第二个字段,然后跟叹号。
2. 在一个文件里的awk命令
如果awk命令放在文件里,就使用-f选项和awk文件名结合使用。处理过程: 把一条记录读到awk的缓存里而且对该记录测试并执行awk文件里的每个命令。在awk完成对第一记录的操作后,删除该记录并把下一条记录读入缓存,依此类推。如果操作不受模式控制,则默认行为是打印整个记录。
例子:
$ cat employees
Mary Adams 5346 11/4/63 28765
Sally Chang 1654 7/22/54 650000
Billy Black 1683 9/23/44 336500
$ cat awkfile
/^Mary/{print "Hello Mary!"}
{print $1, $2, $3}
$ awk -f awkfile employees
Tom Jones 4424
Hello Mary!
Mary Adams 5346
Sally Chang 1654
Billy Black 1683
3. 记录和字段
1〉记录:awk不把输入数据看作一个无穷的字符串,而是把它看作一种格式 或结构。默认情况下把每行叫做一个记录(record),并以一个换行符终 止。输入和输出的记录分隔符默是回车符,保存在内置awk变量ORS 和RS中。ORS和RS可以改变,但是方式有限。
例子:
$ awk '{print $0}' employees
Tom Jones 4424 5/12/66 543354
Mary Adams 5346 11/4/63 28765
Sally Chang 1654
Billy Black 1683 9/23/44 336500
解释:变量$0保存当前记录,这条命令相当于awk '{print}' employees
例子:
$ awk '{print NR,$0}' employees
1 Tom Jones 4424
2 Mary Adams 5346 11/4/63 28765
3 Sally Chang 1654 7/22/54 650000
4 Billy Black 1683 9/23/44 336500
解释:NR代表行号。
4字段
类似表中的字段,是指记录中的一个词条。默认字段分隔符是空白区字段, 也就是空格或制表符(TAB)。Awk中用NF来记录每条记录的字段数量。
字段分隔符
输入字段分隔符:awk的内置变量FS保存输入字段分隔符的值。当时用FS 的默认值时,awk用空格或制表符分隔字段,删除前导空白区和制表符。FS 可以改变,可以在BEGIN语句中改变,也可以在命令中改变。要想在命 令中改变需要用-F选项。
举例:
$ cat employees2
Tom Jones:4424:
Mary Adams:5346:11/4/63:28765
Sally Chang:1654:7/22/54:650000
Billy Black:1683:9/23/44:336500
$ awk '{print $1,$2}' employees2
Tom Jones:4424:5/12/66:543354
Mary Adams:5346:11/4/63:28765
Sally Chang:1654:7/22/54:650000
Billy Black:1683:9/23/44:336500
$ awk -F: '{print $1,$2}' employees2
Tom Jones 4424
Mary Adams 5346
Sally Chang 1654
Billy Black 1683
举例2:多个字段分隔符。如果使用多个字段分隔符,要将其封装在方括号里。
$ awk -F'[ :\t]' '{print $1,$2,$3}' employees2
Tom Jones 4424
Mary Adams 5346
Sally Chang 1654
Billy Black 1683
解释:把空格、制表符、冒号当成输入字段分隔符。
输出字段分隔符:默认的输出字段分隔符用逗号来分隔,被分隔的字段之间打 印一个空格,如果字段之间没有逗号,则打印时各字段将挤在一起。
5.模式和操作
awk 模式(patterns)控制awk将对一行输入作什么样的操作。一个模式包括 一个正则表达式,一个产生正确或者错误条件的表达式,或者它们的组合。 默认操作时打印模式中符合表达式条件的各行。当读入一个模式时,有一条 隐含的if语句。如果if语句是隐含的,周围可以没有花括号。
例子:
$ awk '$3<4000' employees
Sally Chang 1654
Billy Black 1683 9/23/44 336500
解释:如果第3个字段小于4000,则打印该字段。
操作:操作(actions)是封装在花括号里且由分号分隔的语句。如果一个模式 在一个操作之前,则该模式规定了何时执行该操作。
举例:
$ awk '/Tom/{print "Hello there," $1}' employees
Hello there,Tom
解释:如果记录中包含Tom,则打印Hello there,Tom
6.正则表达式
一个正则表达式对awk来说是一个由封装在正斜杠里的字符组成的模式。Awk 支持的正则表达式与egrep基本一样,可以参考下表
元字符 |
说明 |
^ |
字符串首 |
$ |
字符串尾 |
. |
单个任意字符 |
* |
零个或者多个前导字符 |
+ |
一个或者多个前导字符 |
? |
零个或者一个前导字符 |
[ABC] |
匹配【】中的任一字符 |
[^ABC] |
匹配任何一个不在【】中的字符 |
[A-Z] |
匹配A-Z之间的任一字符 |
A|B |
A或者B |
(AB)+ |
一个或者多个AB组合 |
\* |
*本身 |
& |
替代符,替代查找串中匹配的内容 |
举例:
$ awk '/^Mary/' employees
Mary Adams 5346
解释:显示employees文件中以Mary开头的行
$ awk '/^[A-Z][a-z]* /' employees
Tom Jones 4424 5/12/66 543354
Mary Adams 5346 11/4/63 28765
Sally Chang 1654 7/22/54 650000
Billy Black 1683 9/23/44 336500
解释:显示行开头是一个大写字母,然后跟一个或多个小写字母,再跟一个
空格。
匹配操作符(~)、否定号(!)用来与以条记录或字段里的表达式相匹配。
例子:
$ awk '$1 ~/[Bb]ill/' employees
Billy Black 1683 9/23/44 336500
解释:awk将显示第一个字段里与Bill或者bill相匹配的行
$ awk '$1 !~/ly$/' employees
Tom Jones 4424 5/12/66 543354
Mary Adams 5346 11/4/63 28765
解释:显示第一个字段中末尾不是ly的所有行。
比较表达式比较行,如果行里的条件为真,就执行操作。如果给表达式求值 为真则值等于1,反之等于0。
7.关系操作符
下表列出了关系操作符。
运算符 |
含义 |
示例 |
< |
小于 |
x |
<= |
小于等于 |
x<=y |
== |
等于 |
x==y |
!= |
不等于 |
x!=y |
>= |
大于等于 |
x>=y |
> |
大于 |
x>y |
~ |
与正则表达式匹配 |
X~/y/ |
!~ |
不与正则表达式匹配 |
x!~/y/ |
关系操作符举例:
$ cat employees
Tom Jones 4423
Mary Adams 5346 11/4/63 28765
Sally Chang 1654 7/22/54 650000
Billy Black 1683 9/23/44 336500
$ awk '$3==4423' employees
Tom Jones 4423 5/12/66 543354
$ awk '$3 >;5000{print $1}' employees
Mary
$ awk '$2 !~/Adam/' employees
Tom Jones 4423 5/12/66 543354
Sally Chang 1654 7/22/54 650000
Billy Black 1683 9/23/44 336500
条件表达式:一个条件表达式用两个符号,问号和冒号来给表达式求值。
8.条件表达式
格式:
conditional expression1?expression2:expression3 它等同于
{if(expression1)
expression2
else
expression3
}
条件表达式举例:
awk '{max=($1>;$2)?$1:$2;print max}' employees
解释:如果第一个字段大于第二个字段,就把第一个字段的内容赋给max,反之把第
二个字段的内容赋给max,然后打印max
9.计算
可以在模式里执行计算。awk以浮点方式执行所有的算术运算。
+ 加
- 减
* 乘
/ 除
10.复合模式
复合模式 (compound patterns) 是把模式和逻辑操作符相结合的表达式,给 一个表达式从左到右求值。
逻辑运算符
运算符 |
含义 |
例子 |
&& |
逻辑与 |
A&&B |
|| |
逻辑或 |
A||B |
! |
逻辑非 |
!A |
复合模式举例:
$ awk '$3>;4000 && $3<=6000' employees
Tom Jones 4423
Mary Adams 5346 11/4/63 28765
$ awk '!($3>;4000 && $3<=6000)' employees
Sally Chang 1654 7/22/54 650000
Billy Black 1683 9/23/44 336500
11.范围模式
范围模式从一个模式的第一次出现匹配到第二个模式的第一次出现,然后从 第一个模式的第二次出现匹配到第二个模式的第二次出现等等。如果第一个 模式被匹配,而第二个模式没有找到,则awk将显示直到末尾的所有行。
例子:
$ cat datafile
northwest NW Joel Craig 3.0 .98 3 4
western WE Sharon Kelly 5.3 .97 5 23
southwest SW Chris Foster 2.7 .8 2 18
southern SO May Chin 5.1 .95 4 15
southeast SE Derek Johnson 4.0 .7 4 17
eastern EA Susan Beal 4.4 .84 5 20
northeast NE TJ Nichols 5.1 .94 3 13
north NO Val Shultz 4.5 .89 5 9
central CT Sheri Watson 5.7 .94 5 13
$ awk '/^north/,/^west/' datafile
northwest NW Joel Craig 3.0 .98 3 4
western WE Sharon Kelly 5.3 .97 5 23
northeast NE TJ Nichols 5.1 .94 3 13
north NO Val Shultz 4.5 .89 5 9
central CT Sheri Watson 5.7 .94 5 13
12.变量
内置变量要大写,他们可以用在表达式里而且可以被重置。如下表
变量名 |
含义 |
ARGC |
命令行参数的数目 |
FILENAME |
当前输入文件的的文件名 |
FNR |
当前文件的记录数 |
FS |
输入字段分隔符,默认为空格 |
NF |
当前记录中的字段数 |
NR |
目前的记录数 |
OFS |
输出字段分隔符 |
ORS |
输出记录分隔符 |
RS |
输入记录分隔符 |
IGNORECASE |
在正则表达式和字符串匹配中不区分大小写(值为非0时) |
内置变量举例:
$ awk -F: '$1=="Mary Adams"{print NR,$1,$2,$NF}' employees2
2 Mary Adams 5346 28765
解释:-F选项把分隔符改成冒号。如果字段1等于Mary Adams,则打印记 录号、第一个字段、第二个字段和最后一个字段($NF)
赋值运算符
运算符 |
含义 |
等效表达式 |
= |
A=5 |
A=5 |
+= |
A=a+5 |
A+=5 |
-= |
A=a-5 |
a-=5 |
*= |
A=a*5 |
A*=5 |
/= |
A=a/5 |
a/=5 |