一、对awk的基本认知
- awk的基本功能:在文件/字符串中,基于指定规则浏览或者抽取信息。
awk抽取信息后,才可进行其他文本操作
完整的awk脚本通常用来格式化文本内容
awk以文件的 “行” 为处理单位,每接收一行,来执行命令,处理文本- 简单来说,awk就是把文件逐行读入,以空格为默认分隔符,将每行切片,切开的部分再做各种分析处理
二、awk语法
awk [选项参数] ‘{awk语法}’ 文件名
awk[选项参数] -f {awk语法} 文件名
可用的选项参数如下:
- -F fs 指定行中划分数据字段的字段分隔符
- -f program=file 从指定的文件中读取代码数据
- -v var=value 定义awk程序中的一个变量及其默认值
三、awk基本用法
以一段文本为例:
用法一:
awk ‘{[pattern] action}’ {filenames} # 行匹配语句 awk ” 只能用单引号
每行按空格或TAB分割(默认情况),输出文本中的1、4项
格式化输出
用法二:
awk -F #-F相当于内置变量FS, 指定分割字符
happy.c的内容如下:
awk -F, ‘{print $1,$2}’ happy.c(以 ,为分隔符)
使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
用法三:
awk -v # 设置变量
happy.c的内容如下:
awk -va=1 ‘{print $1,$1+a}’ happy.c
> awk -va=1 ‘{print 1 , 1, 1,(1+a)}’ happy.c>
用法四:
awk -f {awk脚本} {文件名}
四、内建变量
内建变量 | 解释 |
---|---|
$n | 当前记录的第n个字段,字段间由FS分割 |
$0 | 完整的输入记录 |
ARGC | 命令行参数的数目 |
ARGIND | 命令行中当前文件的位置 |
ARGV | 包含命令行参数的数组 |
CONVFMT | 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 |
ERRNO | 最后一个系统错误的描述 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
FILENAME | 当前文件名 |
FNR | 各文件分别技术的行号 |
FS | 字段分割符(默认是任何空格) |
IGNORECASE | (如果为真,则进行忽略大小写的匹配) |
NF | 输入字段分隔符 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFMT | 数字的输出格式(默认值是%.6g) |
OFS | 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符 |
ORS | 输出记录分隔符(默认值是一个换行符) |
RLENGTH | 由match函数所匹配的字符串的长度 |
RS | 记录分隔符(默认是一个换行符) |
RSTART | 由match函数所匹配的字符串的第一个位置 |
SUBSEP | 数组下标分隔符(默认值是/034) |
输出顺序号 NR, 匹配文本行号
指定输出分割符
五、使用正则表达式
输出第二列包含"this"的项,并打印第二列与第四列
输出第二列包含 “th”,并打印第二列与第四列
~ 表示模式开始。// 中是模式。
忽略大小写(IGNORECASE的值不为0时)
模式取反
(过滤第一列不包含
"th"的行,并输出其第二列第四列)
(过滤所有不包含
"th"的行,并输出其第二列第四列)
六、awk脚本
需要注意两个关键字
BEGIN
和END
BEGIN{ 这里面放的是执行前
的语句 }
END {这里面放的是处理完所有的行后
要执行的语句 }
{这里面放的是处理每一行时
要执行的语句}假设有一个文件(家庭成员每月水果摄入表)
awk脚本如下:
运行结果如下
七、一些小例子
计算文件大小:
从文件中找出长度大于10的行:
打印九九乘法表: