AWK(仅供自己的学习记录)

169 阅读2分钟

文件名awk.txt,文件内容:

there are many apples
this is a man
10 people
2 students,laughing

1.基本用法

awk按行读取,每一行默认用空格为分割符

$ awk '{print $1}' awk.txt
---------print-----------
there
this
10
2

可以根据-F指定分割符,或者内建变量FS指定分割符

# -F指定一个分割符
$ awk -F',' '{print $1}' awk.txt
---------print-----------
there are many apples
this is a man
10 people
2 students

# -F指定多个分割符
$ awk -F'[ ,]' '{print $1,$3}' awk.txt
---------print-----------
there many
this a
10
2 laughing

# FS指定一个分割符
$ awk 'BEGIN {FS=","} {print$1}' awk.txt
---------print-----------
there are many apples
this is a man
10 people
2 students

# FS指定多个分割符
$ awk 'BEGIN {FS="[ ,]"} {print$1,$3}' awk.txt
---------print-----------
there many
this a
10
2 laughing

根据-v设置参数

# 设置一个变量
$ awk -v a=1 '{print $1+a}' awk.txt
---------print-----------
1
1
11
3

# 设置多个变量
$ awk -v a=1 -v b=m '{print $1+a,$2b}' awk.txt
---------print-----------
1 arem
1 ism
11 peoplem
3 students,laughingm

BEGIN和END用法 awk 'BEGIN{} pattern{} END{}'

  • BEGIN:读输入文件之前执行的代码段,可选
  • body(pattern{}):pattern满足之后才会执行{}里的内容,都为可选值
  • END:body结束后执行,可选
# 1.设置初始变量idx1Str=start:
# 2.在开始读取文件前打印idx1Str
# 3.将行号大于1的第1列追加到idx1Str中
# 4.输出最后结果
$ awk -v idx1Str=start: 'BEGIN{print idx1Str}NR>1{idx1Str=idx1Str$1}END{print idx1Str}' awk.txt
---------print-----------
start:
start:this102

2.运算符

运算符 运算符描述
= += -= *= /= %= ^= **= 赋值
?: C条件表达式
|| 逻辑或
&& 逻辑与
~ 和 !~ 匹配正则表达式和不匹配正则表达式
< <= > >= != == 关系运算符
空格 连接
+ - * / % 加,减,乘,除,求余
+ - ! 一元加,减和逻辑非
^ *** 求幂
++ -- 增加或减少,作为前缀或后缀
$ 字段引用
in 数组成员

输出第一列大于2的行

$ awk '$1>2 {print $0}' awk.txt
---------print-----------
there are many apples
this is a man
10 people

输入第一列大于2且第二列等于people的行

$ awk '$1>2&&$2=="people" {print $0}' awk.txt
---------print-----------
10 people

输出第一列以th开头的行

$ awk '$1~/th*/ {print $0}' awk.txt
---------print-----------
there are many apples
this is a man

3.内建变量

变量 描述
$n 当前记录的第n个字段,字段间由FS分隔
$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)

内建变量可直接使用,输出文件名,行号,内容

$ awk 'BEGIN{print "filename\tlinenumber\tline"}{print FILENAME,NR,$0}' awk.txt
---------print-----------
filename	linenumber	line
awk.txt 1 there are many apples
awk.txt 2 this is a man
awk.txt 3 10 people
awk.txt 4 2 students,laughing