一.
1. awk命令简介
awk是专门为文本处理设计的编.程语言,也是一个应用程序,几乎所有Linux发行版本都自带这个程序。我们通常用它进行数据扫描、过滤、统计汇总工作。
awk是一种强大的编辑工具,比较倾向于一行当中分成数个字段来处理,因为awk相当适合小型的文本数据。
awk 比较倾向于将一行分成多个字段然后再进行处理,且默认情况下字段的分隔符为空格或 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。
awk工作原理
逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
在使用awk命令的过程中,可以使用逻辑操作符“&&”表示“与”、“||”表示“或”、“!”表示“非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。
2. awk命令格式
它与grep、sed命令一样都是以行为单位读取文本的,默认以空格或Tab键为分隔符,将分割所得的各个字段保存到内建变量中供后续使用。
命令格式如下:
awk "[选项1] {操作1;操作2} [选项2] {操作3;操作4} ..." 文件名
awk -f 脚本文件 文件名
-f 脚本文件, --file=脚本文件
-F fs, --field-separator=fs
-v var=val, --assign=var=val
-b, --characters-as-bytes
-c, --traditional
-C, --copyright
-d[文件], --dump-variables[=文件]
-D[文件], --debug[=文件]
-e '程序文本', --source='程序文本'
-E 文件, --exec=文件
-g, --gen-pot
-h, --help
-i 包含文件, --include=包含文件
-I, --trace
-l 库, --load=库
-L[fatal|invalid|no-ext], --lint[=fatal|invalid|no-ext]
-M, --bignum
-N, --use-lc-numeric
-n, --non-decimal-data
-o[文件], --pretty-print[=文件]
-O, --optimize
-p[文件], --profile[=文件]
-P, --posix
-r, --re-interval
-s, --no-optimize
-S, --sandbox
-t, --lint-old
-V, --version
二.
模式
用来指定要处理的行。
模式可以是以下任意一个:
/正则表达式/:使用ERE。
关系表达式:使用运算符操作,可以是字符串或数字的比较测试。
包含表达式:使用运算符~(包含)和!~(不包含)。
BEGIN:如果模式是BEGIN,说明后面的操作只在程序开始时执行一次。
END:如果模式是END,说明后面的操作只在程序结束时执行一次。
模式1, 模式2:从匹配模式1的行到匹配模式2的行(包含该行)。
省略:表示处理所有行。
内置变量
变量 | 描述 |
$n | 当前记录的第n个字段,字段间由FS分隔,n从1开始 |
$0 | 完整的输入记录 |
ARGC | 命令行参数的数目 |
ARGIND | 命令行中当前文件的位置(从0开始算) |
ARGV | 包含命令行参数的数组 |
CONVFMT | 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 |
ERRNO | 最后一个系统错误的描述 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
FILENAME | 当前文件名 |
FNR | 各文件分别计数的行号 |
FS | 字段分隔符(默认是任何空格) |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
NF | 一条记录的字段的数目 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFMT | 数字的输出格式(默认值是%.6g) |
OFS | 输出字段分隔符,默认值与输入字段分隔符一致。 |
ORS | 输出记录分隔符(默认值是一个换行符) |
RLENGTH | match函数所匹配的字符串的长度 |
RS | 记录分隔符(默认是一个换行符) |
RSTART | 由match函数所匹配的字符串的第一个位置 |
SUBSEP | 数组下标分隔符(默认值是/034) |
三.
示例用法
1. AWK的打印控制
我们可以使用AWK对打印输出进行控制。例如,我们可以使用以下命令在文件中查找所有以“a”开头的行,并输出该行以及该行的行号:
`awk '/^a/{print $0, NR}' file`
这里,“/^a/”代表要匹配的字符串以“a”开头,“{print $0, NR}”则表示输出匹配到的这一行和行号。
2. AWK的数组处理
`awk '{
for(i=1; i<=NF; i++) {
count[$i]++
}
}
END {
for(j in count) {
print j, count[j]
}
}' file | sort -k2 -r | head -3`
3.AWK的模式匹配和替换
AWK还包括一些用于模式匹配和替换的内置函数。例如,我们可以使用gsub函数来替换文件中所有的空格为下划线:
`awk '{gsub(/ /,"_"); print}' file`