awk学习

awk 文本处理器详解
本文介绍了awk,一款Linux上的文本处理器。通过基本语法和实例,展示了如何根据文本内容执行指令,包括打印特定字段、根据模式匹配文本。还提及了awk的内置变量、选项和action的使用。

介绍

awk是Linux上的一款文本处理器。通过awk,可以实现根据文本执行相应的指令。

基本语法

$ awk [option] 'pattern {action}' test.txt
基本的用法是读取test.txt中的每一行。对于每一行,对于pattern匹配的文本,执行action。
下面用几个简单的例子介绍该基本用法。

示例1——打印文本

以下是一个例子:

book.txt:

book publisher price
apue pearson 100
csapp pearson 80

执行 awk '{print $2}' book.txt 的结果为:

publisher
pearson
pearson

其实就是对于每一行,以空格作为分隔,分割为多个field。然后将每一行的第二个field给打印出来。{print $2} 即为打印的具体action。

示例2——根据pattern打印文本

在上一个示例中,我们并没有使用到pattern。在本示例中,我们不打印抬头行,即只打印第二行之后的内容。命令如下:
awk 'NR > 1 {print $0} book.txt'
结果为:

apue pearson 100
csapp pearson 80 

这里NR是awk的内置变量,代表”the number of row”。awk内还有更多的内置变量,如FNR(NR in file,文件中的行数)、NF(number of field,该行含有field的个数)、FS(file seperator, 文件分隔符,默认为空格,可以通过选项-F指定)。
$0是指这行的所有field。

awk的pattern不仅支持逻辑表达式,也支持正则表达式。例如下面的是打印出价格在10-99元的书:
awk '$3 ~ /^[1-9][1-9]$/ {print $0}' awk.txt
结果为:

csapp pearson 80

这里~为匹配操作符,$3 ~ /^[1-9][0-9]$/ 匹配第三个field能够匹配正则表达式^[1-9][0-9]$ 的行。正则表达式需用/xxx/ 表示。需要指出的是,在awk中正则表达式的匹配是全局匹配,即寻找到一个子串符合表达式即为匹配。

awk中的pattern支持&&和||等与或非逻辑,例如:里
awk '$3 ~ /^[0-9]{1}[0-9]{1}$/ && $2 == "pearson" {print $0}' awk.txt
意为找出价格在10-99元之间且出版商为pearson的图书。

选项

-F: 选择文本分隔符,默认为空格
例如,对于文件

book|publisher|price
apue|pearson|100
csapp|pearson|80

我们可以使用命令awk -F "|" '$3 ~ /^[1-9][0-9]$/ {print $3}' book.txt
实现示例2中的功能。

-v var=value: 设定变量值以在awk中使用。可以多次使用以设置多个变量值。
例如:执行awk -v a=1 '{print a}' 的结果为:

1

-f progfile: 运行指定的awk脚本。脚本的写法将在以后介绍。

action

action可以写成形如C语言的语句。例如:
awk -F "|" -v a=2 -v b=3 '{printf("a=%d\t",a);printf("b=%d\n", b)}' book.txt 的结果为:

a=2 b=3

未完待续。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值