awk笔记

语法:

1
2
3
awk [参数] '具体命令' var=xxx file(s)
#
awk [参数] -f 具体命令所在文件 var=xxx file(s)

示例1:

1
2
3
4
5
# 每行按空格或\t分隔,输出文本的第1,4列
awk '{print $1,$4}' log.txt

# 比上面多了格式. (左对齐,第一列宽8,第二列宽10)
awk '{printf "%-8s %-10s\n",$1,$4}' log.txt

示例1中使用的是默认分隔符(空格或\t),也可以通过-F参数指定分隔符.

示例2:

1
2
3
4
5
6
7
8
# 使用逗号分隔
awk -F, '{print $1,$2}' log.txt
# 使用空格分隔
awk -F' ' '{print $1,$2}' log.txt
# 使用t字母分隔
awk 'BEGIN{FS="t"} {print $1}' log.txt
# 使用多个分隔符.
awk -F '[ ,]' '{print $1,$2,$5}' log.txt

awk -v #设置变量
示例3:

1
2
3
4
awk -va=1 '{print $1,$1+a}' log.txt
# mac下的话:
awk -v a=1 '{print $1,$1+a}' log.txt
# 非数字+1=1

示例4:(过滤)

1
2
3
4
5
awk '$1>2' log.txt  # 第一列大于2
# 非数字大于2

# 第一列>2且第二列为Are:
awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt

示例5:(正则匹配)
~ 表示模式开始, 表达式首尾加上斜杠:
语法:
awk '$2 ~ /正则表达式/ {print $1}' log.txt

1
2
3
4
5
# 第二列符合正则: th[a-z]+ 
awk '$2 ~ /th[a-z]+/ {print $2}' log.txt

# 模式取反:
awk '$2 !~ /th[a-z]+/ {print $2}' log.txt`

awk脚本语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/awk -f
#运行前
BEGIN {
math = 0
english = 0
computer = 0
printf "NAME NO. MATH ENGLISH COMPUTER TOTAL\n"
printf "---------------------------------------------\n"
}
#运行中 // 每一行
{
math+=$3
english+=$4
computer+=$5
printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
END {
printf "---------------------------------------------\n"
printf " TOTAL:%10d %8d %8d \n", math, english, computer
printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}

推荐文章