awk进行文本处理

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时, 它会反复进行下列四步骤.

  1. 自动从指定的数据文件中读取一个数据行.
  2. 自动更新(Update)相关的内建变量之值. 如 : NF, NR, $0...
  3. 依次执行程序中 所有 的 Pattern { Actions } 指令.
  4. 当执行完程序中所有 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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值