1. 格式
awk 选项 ‘匹配规则{执行命令}’ file_name
例如: awk -F: '/^$/{print “blank lines”} test.txt
选项 | 含义 |
---|---|
-F fs | 指定分隔符 |
-f file | 指定执行的脚本文件 |
-v var=val | 在执行处理过程之前,设置一个变量 var,并给其设备初始值为 val(多个-v可生成多个变量)。 |
–dump-variables=file | 将全局变量输入到文件中去, 默认文件名为awkvars.out |
–lint | 检查代码(不知道有啥用…) |
–posix | 打开检查POSIX兼容性, 所有扩展功能会关闭 |
–profile=file | 将命令写入文件,默认为awkprof.out |
–version | 展示版本信息 |
2. 数据变量:
选项 | 含义 |
---|---|
$0 | 整行 |
$n | 第n个数据字段 |
ARGC | 命令行输入参数的个数 |
ARGV | 命令行输入参数数组 |
CONVFMT | 数字转化为字符串的格式%.6g |
OFMT | 数字输出的格式,默认%.6g |
ENVIRON | 环境变量数组 |
FILENAME | 当前文件名称 |
FS | 字段间分隔符,默认为空格 |
NF | number of fields(当前行的字段数) |
NR | number of records(已读入的行数) |
FNR | 当前文件已读入的行数, 处理多个文件时有用 |
OFS | 输出字段间的分隔符,默认空格 |
ORS | 输出行间分隔符, 默认换行符 |
RS | 输入记录的分割符, 默认为换行符 |
RLENGTH | match函数匹配的字符串的长度 |
RSTART | 此变量表示由 match 函数匹配的字符串的第一个字符的位置 |
SUBSEP | 多维数组下标间的分隔符, 默认’\034’, 有用! |
FIELDWIDTHS | 一组空格分割的数字, 将文本按数字对应长度输出, 忽略fs的作用 |
IGNORECASE | 设置为非0时, 匹配会忽略大小写, 默认为0 |
3. 操作符
“+ - * / ^ %” : 5种基本运算;
“++ --”: 自增自减
"= ,+=, -=,… ": 赋值操作
“== !=, >, <, >=, <=”: 比较操作符
“&& || !”: 逻辑运算符
“expression ? statement1 : statement2”: 三元运算符
“+a, -a”: 一元运算符, 表示乘以1或-1
“^ * *”: 指数运算符
" ": 通过空格或双引号可以字符串连接
in: 可以访问数组成员;
~和!~
: 用于匹配或不匹配awk '$0 !~ 9' marks.txt
4. 正则表达式
和通用正则表达式类似
5. 数组
awk数组比较灵活, 索引可以是数字或字符串, 不需要提前声明;
多维数组可以用一维数组模拟: 比如 a["0,0"] = 100
删除数组操作: delete a[0]
6. if - else
格式为: if (condition) {action1;action2};else if(condition2) action3;else action4
注意中间用分号分割;
7. 循环
7.1 for
格式: for(i =0 ; i <5 ; i ++) action
awk 'BEGIN { for (i = 1; i <= 5; ++i) print i }'
awk 'BEGIN{for (i in a) print i, a[i]}'
7.2 while, do-while
格式: while(condition) action; do action while (condition)
awk 'BEGIN {i = 1; while (i < 6) { print i; ++i } }'
awk 'BEGIN {i = 1; do { print i; ++i } while (i < 6) }'
7.3 break, continue, exit(n)
3. 关键字
BEGIN和END关键字: 分别在读取文件前和读取文件后执行;
$ awk 'BEGIN{print "aaa"} /0210000b27d45d19f3885e62e/ {print $0} END{print "bbb"}' test.txt
aaa
1586846340 0210000b27d45d19f3885e62e 200
1586846340 0210000b27d45d19f3885e62e 100
bbb
4. 内置函数
4.1 数学函数:
int(), rand(), cos()等
4.2 字符串函数:
(1) asort(array, d), asort(array, d)
asort 对数组value排序, 然后索引会变为0, 1,2 …等整数, 原索引丢失;
asorti对数组index排序, index排序后变为value, 原value丢失, 索引变为0,1,2等;
d参数: 复制后再排序, 不改变原数组;
(2)gsub(rex, sub, str), index(str, sub), sub(), match(str, rex), sub(rex, sub, str)
gsub将匹配rex的内容替换为sub, 全局替换;
index 返回匹配sub的第一个字符的索引, 匹配失败返回0, 字符串索引从1开始;
match 返回匹配rex的第一个位置, 匹配失败返回0;
sub 同gsub, 只替换匹配到的第一个
(3) split(str, array, rex), sprintf(str, format-list)
split使用rex分割字符串,然后将分割的结果保存在array中;
sprintf 使用format-list对str格式化, 然后返回格式化后的字符串;
(4) strtonum(str)
将字符串转为数字, 如果以0开头, 当八进制处理, 如果以0x开头, 以十六进制处理;
(5) substr(str, start, l)
返回字符串的子串
(6) tolower(), toupper()
(7)length: awk 'length($0) > 18' marks.txt
4.3 时间函数
(1) systime() 返回时间戳;
(2) mktime(YYYY MM DD HH MM SS) 字符串转为时间戳;
(3) strftime(format , timestamp) 时间戳转字符串;
4.4 其他函数
(1) systime(str) 执行命令并返回执行码;
(2) 位操作, close, exit等
(3) getline 读入下一行;
(4) next: 停止处理, 进入下一行的处理;
(5) 停止当前文件的处理, 开始下一个文件的处理;
(6) return 用于自定义函数的返回值;
5. 自定义函数
function function_name(argument1, argument2, ...)
{
function body
}
6. 重定向
和shell相似 支持 > , >>, 和管道符
awk 'BEGIN { print "hello, world !!!" | "tr [a-z] [A-Z]" }'
echo "Old data" > /tmp/message.txt
7. 使用注意:
1. 在 awk 程序执行时,如果没有指定执行命令,则默认会把匹配的行输出;如果不指定匹配规则,则默认匹配文本中所有的行。
2. 多个命令之间用分号分割, 从文件读取命令不需要分号,只要每行1个命令即可;
[root@localhost ~]# cat awk.sh
{print $1 "'s home directory is " $6}
[root@localhost ~]# awk -F: -f awk.sh /etc/passwd
root's home directory is /root
bin's home directory is /bin
daemon's home directory is /sbin
adm's home directory is /var/adm
lp's home directory is /var/spool/lpd
3. awk命令中使用变量不需要提前申明
awk '/a/{++cnt} END {print "Count = ", cnt}' marks.txt