1 awk的内置变量
awk 所内建的字段变量及其涵意如下 :
字段变量 | 含义 |
$0 | 一字符串, 其内容为目前 awk 所读入的数据行. |
$1 | $0 上第一个字段的数据. |
$2 | $0 上第二个字段的数据. |
... | 其余类推 |
内建变量 | 含义 |
NF (Number of Fields) | 为一整数, 其值表$0上所存在的字段数目. |
NR (Number of Records) | 为一整数, 其值表awk已读入的数据行数目. |
FILENAME | 正在处理的数据文件文件名. |
[dss@localhost ~]$ awk 'NR==1,NR==10 {print NR,$1,$3,$4,$5,$6,$7,$8,$9}' firewallb-week2-origin.sql
1 1 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Built ASA-6-302013
2 2 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Teardown ASA-6-302014
3 3 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Teardown ASA-6-302014
4 4 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Built ASA-6-302013
5 5 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Teardown ASA-6-302014
6 6 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Teardown ASA-6-302014
7 7 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Built ASA-6-302013
8 8 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Built ASA-6-302013
9 9 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Built ASA-6-302013
10 10 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Teardown ASA-6-302014
[dss@localhost ~]$
例如 : awk 从文件 firewallb-week2-origin.sql中读入第一到第十行数据
$0 是一行的数据
NR是行号
$3是07:02:35
FILENAME是firewallb-week2-origin.sql
例如 : awk 从文件 firewallb-week2-origin.sql中读入第一到第十行数据并输出到aa.txt
[dss@localhost ~]$ awk 'NR==1,NR==10 {print NR,$1,$3,$4,$5,$6,$7,$8,$9}' firewallb-week2-origin.sql >aa.txt
[dss@localhost ~]$ cat aa.txt
1 1 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Built ASA-6-302013
2 2 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Teardown ASA-6-302014
3 3 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Teardown ASA-6-302014
4 4 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Built ASA-6-302013
5 5 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Teardown ASA-6-302014
6 6 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Teardown ASA-6-302014
7 7 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Built ASA-6-302013
8 8 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Built ASA-6-302013
9 9 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Built ASA-6-302013
10 10 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Teardown ASA-6-302014
[dss@localhost ~]$
2. 工作流程 :
执行awk时, 它会反复进行下列四步骤.
- 自动从指定的数据文件中读取一个数据行.
- 自动更新(Update)相关的内建变量之值. 如 : NF, NR, $0...
- 依次执行程序中 所有 的 Pattern { Actions } 指令.
- 当执行完程序中所有 Pattern { Actions } 时, 若数据文件中还有未读取的数据, 则反复执行步骤1到步骤4.
awk会自动重复进行上述4个步骤, 使用者不须于程序中编写这个循环 (Loop).
3.使用
两种方式:
a. $ awk -f awk程序文件名 数据文件文件名
$ awk -f aa.awk aa.txt (-f 表示指定awk程序文件)
b. $ awk '{ print $2, $3 * $4 }' aa.txt
[dss@localhost ~]$ awk '{ print $2, $1 * $2,$8 }' aa.txt
1 1 Built
2 4 Teardown
3 9 Teardown
4 16 Built
5 25 Teardown
6 36 Teardown
7 49 Built
8 64 Built
9 81 Built
10 100 Teardown
[dss@localhost ~]$ awk '{ printf("%6s 乘法:%3d name:%6s\n", $2, $1 * $2,$8) }' aa.txt
1 乘法: 1 name: Built
2 乘法: 4 name:Teardown
3 乘法: 9 name:Teardown
4 乘法: 16 name: Built
5 乘法: 25 name:Teardown
6 乘法: 36 name:Teardown
7 乘法: 49 name: Built
8 乘法: 64 name: Built
9 乘法: 81 name: Built
10 乘法:100 name:Teardown
获得文件总行数
awk 'END{print NR}' firewallb-week2-origin.sql
[dss@localhost ~]$ awk 'END{print NR}' firewallb-week2-origin.sql
16600931
4.awk 参数
-v 指定程序中的变量 awk -v a=1 '{xxx}' 可以使用a变量
-f 指定程序外部文件 awk -f bb.awk data
-F 指定分隔符 awk -f \\t '{xxx}' 指定分隔符为\t ,默认为空格
5:数组的用法
有一个文件,第1栏是人员编号,其后几行是会的语言
[jifeng@jifeng02 hadoop]$ cat course.txt
1 英语 中文 法文 日文
2 中文 法文
3 中文 法文 日文
4 中文 法文 拉丁
5 中文 法文 德文
要统计会各种语言的人数,执行如下:
建立如下程序,并取名为 course.awk:
[jifeng@jifeng02 hadoop]$ cat course.awk
{ for( i=2; i <= NF; i++) Number[$i]++ }
END{for(course in Number) printf("%10s %d\n", course, Number[course] )}
执行:
[jifeng@jifeng02 hadoop]$ awk -f course.awk course.txt
法文 5
中文 5
德文 1
日文 2
拉丁 1
英语 1