文件名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