awk pattern { action } {filenames}
# $0变量是指整条记录,$1表示当前行的第一个域,$2表示当前行的第二个域,$n当前记录的第n个域,字段间由FS分隔, 每行按 FS 字段分隔符(默认是空格或tab)
# cat 1.txt
Beth 4.00 0
Dan 3.75 0
kathy 4.00 10
Mark 5.00 20
Mary 5.50 22
Susie 4.25 18
# 输出文本中的1、3列
awk '{print $1,$3}’ 1.txt
Beth 0
Dan 0
kathy 10
Mark 20
Mary 22
Susie 18
# $NF是number finally,表示最后一列的信息
awk '{print $NF}' 1.txt
0
0
10
20
22
18
# 筛选 第三列等于0的第一列的值
awk '$3 == 0 {print $1}' 1.txt
Beth
Dan
# -F 指定输入文件折分隔符
cat 2.txt
# 2.txt
Beth:4.00:0
awk -F ':' '{print $2}' 2.txt
4.00
# 打印出每行的行号NR代表行号
awk '{print "我是行号",NR,$0}' 1.txt
我是行号 1 Beth 4.00 0
我是行号 2 Dan 3.75 0
我是行号 3 kathy 4.00 10
我是行号 4 Mark 5.00 20
我是行号 5 Mary 5.50 22
我是行号 6 Susie 4.25 18
# BEGIN 和 END
# BEGIN 用于匹配第一个输入文件的第一行之前的位置, END 则用于匹配处理过的最后一个文# 件的最后一行之后的位置
awk 'BEGIN { print "标题一标题二 标题三"; print "-------------------"} { print}' 1.txt
标题一标题二 标题三
-------------------
Beth 4.00 0
Dan 3.75 0
kathy 4.00 10
Mark 5.00 20
Mary 5.50 22
Susie 4.25 18
# 打印最后一行 等同于 tail -n 1 1.txt 等同于 sed -n '$p' 1.txt
awk 'END { print $0}' 1.txt
Susie 4.25 18
# 设置变量
awk '{tail=($1 "~~~~~")} {print tail}' 1.txt
Beth~~~~~
Dan~~~~~
kathy~~~~~
Mark~~~~~
Mary~~~~~
Susie~~~~~
# for循环 每行打印2遍
awk '{for(i=0; i < 2; i++) print $0}' 1.txt
Beth 4.00 0
Beth 4.00 0
Dan 3.75 0
Dan 3.75 0
kathy 4.00 10
kathy 4.00 10
Mark 5.00 20
Mark 5.00 20
Mary 5.50 22
Mary 5.50 22
Susie 4.25 18
Susie 4.25 18
# 逆序打印
awk '{arr[NR] = $0 }END{for(i = NR;i >0;i --) print arr[i]}' 1.txt
Susie 4.25 18
Mary 5.50 22
Mark 5.00 20
kathy 4.00 10
Dan 3.75 0
Beth 4.00 0
# 去重复行
awk '!($0 in x){x[$0];print $0 }' 1.txt
# 其他:
https://www.gnu.org/software/gawk/manual/gawk.html#Advanced-Features