基本格式
awk '
BEGIN { --> BEGIN 中的操作, 仅执行一次
do sth.
}
(pattern_1) { do sth. } --> 从这里开始,是逐行解析文本时执行的操作,可以写多个
END {
do sth. --> 末尾执行的操作(仅执行一次)
}
' FILENAME --> 文件名, 也可以从管道符获取输入, 只包含BEGIN时,不需要输入
变量
内置变量
$0 # 表示所有
$1, $2.. # 某列
NR # 行号, number of row
NF # 列总数, number of field
$NF # 最后一列
FS # 输入列分隔符, 默认" ", 可通过"-F"指定
OFS # 输出列分隔符, 默认" ", output field sep
ORS # 输出行分隔符, 默认"\n", output row sep
RS # 输入行分隔符, 默认"\n", 不按换行符作为行末尾
变量赋值
# 赋值. 弱类型, 赋值时未确定类型, 根据使用的方式决定类型
x = 1
# 拼接字符串
x = "1"x # 等价: x = 1x
# 计算
x++
x+=1
使用示例
# 根据列打印
awk -F: '{print $1,$6}' /etc/passwd
# 设置输入分隔符
awk 'BEGIN {FS=":"} {print $1,$6}' /etc/passwd
awk -F: '{print $1"="$6}' /etc/passwd
# 设置输入及输出分隔符
awk 'BEGIN {FS=":";OFS="="} {print $1,$6}' /etc/passwd
# 设置变量, 计算某一列的和
awk -F: 'BEGIN{sum=0} {sum+=$3} END{print sum}' /etc/passwd
# 支持隐式设置, 与上边等价
awk '{sum+=$5} END{print sum}' a
格式化输出
# 替换字符串, 默认自动长度
awk 'BEGIN {printf "%s: %s\n", "foo", "bar"}'
# 设置字符串占用长度, 且右对齐
awk 'BEGIN {printf "|%10s|: |%10s|\n", "foo", "bar"}'
# 设置字符串占用长度, 且左对齐
awk 'BEGIN {printf "|%-10s|: |%-10s|\n", "foo", "bar"}'
匹配
运算符条件
- 等于:
$1==x
- 不等于
- 大于小于
正则条件
- 行匹配
- 行不匹配
- 字段匹配
- 字段不匹配
使用示例
# 匹配模式, 可以是通配模式,也可以是正则模式
# 行匹配, 整行匹配到这个字符, 匹配成功就打印
awk ' /xx/ { print }'
# 行不匹配
awk ' !/xx/ { print }'
# 列匹配, 精确匹配
awk '$1 == "root" { print }' /etc/passwd
awk '$1 != "root" { print }' /etc/passwd
# 列匹配, 正则匹配
awk '$1~/^root/ { print }' /etc/passwd
awk '$1!~/^root/ { print }' /etc/passwd
# 补充# 行数大于1且小于10时打印,括号可加可不加
awk '(NR>1&&NR<10) {print}' a
# 等价(行2到行9), 这里不能加括号
awk 'NR==2,NR==9 { print }' a
if 判断
# 条件判断
# 示例是写在操作体里, 作为判断方式
# 等价于 awk '$1~/root/ {print}' /etc/passwd
awk '{ if($1~"root") print }' /etc/passwd
循环
- 支持 for 循环和 while 循环
- 支持 break 和continue
for 循环
# for i 循环
awk 'BEGIN {for(i=0;i<10;i++) print i}'
# 这个相当于每读一行文本,都会执行一次完整的for循环
awk '
{
for( i = 1; i < 10; i += 2 )
{print}
}
' /etc/passwd
# for range 循环(配合数组使用)
# 两个赋值,一个循环输出
awk 'BEGIN {arr["a"]="aaa";arr["b"]="bbb";for(x in arr) print arr[x]}'
while 循环
# 两种写法结果等价
awk 'BEGIN {
while (i < 10) {
print i
i++
}
}'
awk 'BEGIN {
i = 1
do {
print i
i++
} while (i < 10)
}'
数组
awk 'BEGIN {
assoc["key1"] = "val1"
assoc["key2"] = "val2"
for (key in assoc)
print assoc[key];
}'
函数
函数名 | 示例 | 说明 |
---|---|---|
length(str) | awk 'BEGIN {a=length("aaa"); print a}' |
字符串长度 |
printf("formatStr", ele1, ele2) | awk 'BEGIN {printf("%s: %s\n", "foo", "bar")}' |
格式化字符串 |
toupper(str) | 转大写 | |
tolower(str) | 转小写 | |
index(a, b) | awk '{print index($0,"root")}' /etc/passwd |
字符串a中出现字符串b的索引, 未找到为0 |