这两天花了点时间学awk,虽然只是基础,不过还是要整理一下。顺便介绍一个比较好得学习网站:
https://www6.software.ibm.com/
AWK是一种文本处理和模式匹配语言,程序语句描述需要进行匹配和处理的输入数据。AWK程序在其输入数据中搜索包含模式的记录、对记录执行指定的操作,直到程序到达输入的末尾。
与perl一样,awk是一种解释性语言,所以awk不需要进行编译。
GAWK 具有下列独特的特性和优点:
- 在所有主要的 UNIX 平台以及其他操作系统中都可以使用它,包括 Mac OS X 和 Microsoft® Windows®。
- 它是可移植操作系统接口 (POSIX) 兼容的,并且包含 1992 POSIX 标准中的所有特性。
- 它没有预定义的内存限制。
- 可以使用一些新的内置函数和变量。
- 它包含一些特殊的
regexp
操作符。 - 记录分隔符中可以包含
regexp
操作符。 - 可以使用特殊文件支持来访问标准的 UNIX 流。
- 可以使用 Lint 检查。
- 在缺省情况下,它使用扩展的正则表达式。
- 它支持无限制的行长度和连续使用反斜杠字符 (
/
)。 - 它具有更好的、更具描述性的错误消息。
- 它包含一些 TCP/IP 网络函数。
AWK以文本进行操作,而文本又包括文件或标准输入流,它对文本进行分类得到记录和字段。记录由记录分隔符指定,默认的记录分隔符为换行符,存放在RS变量中,可以自行修改;字段由字段分隔符指定,默认为空格,存放在变量FS中,也可以修改。
记录
每个记录中的每个字段都存放在相应的编号中,如第一个字段为1,第二个字段为2,第N个字段为NF,编号0引用当前整个记录
字段
AWK的规则
/pattern/ {action}
pattern为模式,action为执行的操作,对所有匹配pattern的记录进行action操作,如
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//为任意模式,也就是匹配所有记录,print将记录输出,上面命令为将文件myfile输出到标准输出。{}为空操作,不执行任何操作,多个action用分号";"分隔。
两个特殊的模式
BEGIN{action}、END{action},前者在文本之前执行,常定义一些变量,后者在文本之后执行,常做一些制表,汇总的处理
常用命令
语句 | 描述 |
---|---|
exit | 停止程序的执行,并且退出。 |
next | 停止处理当前记录,并且前进到下一条记录。 |
nextfile | 停止处理当前文件,并且前进到下一个文件。 |
print | 打印使用引号括起来的文本、记录、字段和变量。(缺省情况下是打印出当前整行记录。) |
printf | 打印格式化文本,类似于它的 C 语言对等成分,但必须指定结尾的换行。 |
sprintf | 返回格式化文本字符串,与 printf 使用相同的格式。 |
四种不同的方法使用awk:文件、命令行、筛选器、脚本。
命令行:awk '/pattern/{action}' filename
文件:awk -f awkfile filename //不用打引号
脚本:#! /usr/bin/awk -f //以此开头
筛选器:用管道将数据传入awk $cat sampel | awk '//{print}'
字段和记录
如文件myfile:
Heigh-ho! sing, heigh-ho! unto the green holly:
Most friendship is feigning, most loving mere folly:
Then, heigh-ho, the holly!
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
输出
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
注意$1和$2之间的逗号是用来输出空格的。
字段分隔符
一般在BEGIN模式中定义,如 $awk 'BEGIN{FS = "!"} //{print $1}' myfile
还可以用-F选项指定字段分隔符,如 $awk -F ":" '//{print $1}' myfile
常用变量
变量 | 描述 |
---|---|
NF | 该变量包含每个记录的字段个数。 |
NR | 该变量包含当前的记录个数。 |
FS | 该变量是字段分隔符。 |
RS | 该变量是记录分隔符。 |
OFS | 该变量是输出字段分隔符。 |
ORS | 该变量是输出记录分隔符。 |
FILENAME | 该变量包含所读取的输入文件的名称。 |
IGNORECASE | 当 IGNORECASE 设置为非空值,GAWK 将忽略模式匹配中的大小写。 |
GAWK 模式匹配
1. 字符串:
匹配有green字段的记录
2. 正则表达式:
匹配两个感叹号间有任何字符串的文本的记录
3. 非打印字符:/xxx 十进制数,xxx为10进制
/xNN十六进制,NN为16进制
格式
field !~ /xxx/ #不包含
field ~ /xxx/ #包含
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
输出
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
可以在两个模式之间使用布尔表达式 &&、| | 或 可以在模式之前使用 !
在两个模式之间使用逗号(,)可以指定一个范围,它输出包括匹配项部分的完整内容,即使在两个不同的记录中。