Linux命令—awk
awk不仅仅时linux系统中的一个命令,而且是一种编程语言,可以用来处理数据和生成报告(excel)。处理的数据可以是一个或多个文件,可以是来自标准输入,也可以通过管道获取标准输入,awk可以在命令行上直接编辑命令进行操作,也可以编写成awk程序来进行更为复杂的运用。
本章主要讲解awk命令的运用
awk格式
1
| awk [option] 'PATTERN{ACTION STATEMENTS}' FILE
|

- awk指令是由模式,动作,或者模式和动作的组合组成。
- 模式既pattern,可以类似理解成sed的模式匹配,可以由表达式组成,也可以是两个正斜杠之间的正则表达式。比如NR==1,这就是模式,可以把他理解为一个条件。
- 动作即action,是由在大括号里面的一条或多条语句组成,语句之间使用分号隔开。比如awk使用格式:
- pattern既模式,也可以理解为条件,也叫找谁,你找谁?高矮,胖瘦,男女?都是条件,既模式。
- action既动作,可以理解为干啥,找到人之后你要做什么。
模式和动作的详细介绍我们放在后面部分,现在大家先对awk结构有一个了解。
常用内建变量(可以直接使用的变量)
- $0:完整的输入记录
- $n:当前记录的第n个字段,字段间由FS分隔
- FS:input field seperator:输入字段分隔符,默认空白字符。也可使用-v指定。
- OFS:输出字段分隔符。使用-v指定。
- RS:输入时的换行符
- ORS:输出时的换行符
- NF:number of field 每一行的字段数量。加上$NF表示最后一列。
- NR:number of record 文件的行数,打印出来是打印行号
- FILENAME:当前文件的文件名
常用命令
print
输出格式:print item1,item2 …
备注:使用逗号作为分隔符;输出item可以是字符串、內建变量、awk表达式;若省略item,则显示$0整行;
printf
格式化输出:printf FORMAT, item1, item2…按位放在format中。
注意事项:format必须要给出;如需换行,必须要显示写出;format中需要为后面每个item指定格式符;
F
指定输入文件折分隔符
awk的简单使用
待处理文件为:
1 2 3 4 5
| $ cat test.txt hello world! hello carl! hello jack! Hi carl!
|
输出文件全部内容
1 2 3 4 5
| $ awk '{print $0}' test.txt hello world! hello carl! hello jack! Hi carl!
|
输出第一列内容
1 2 3 4 5
| $ awk '{print $1}' test.txt hello hello hello Hi
|
输出第2行到第4行的内容
1 2
| $ awk 'NR>2&&NR<4 {print $0}' test.txt hello jack!
|
以o为分隔符输出第一列和第二列内容
1 2 3 4 5
| awk -Fo '{print $1,$2}' test.txt hell w hell carl! hell jack! Hi carl!
|
awk进阶使用
打印九九乘法表
1 2 3 4 5 6 7 8 9 10
| seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}' 1x1=1 1x2=2 2x2=4 1x3=3 2x3=6 3x3=9 1x4=4 2x4=8 3x4=12 4x4=16 1x5=5 2x5=10 3x5=15 4x5=20 5x5=25 1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36 1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49 1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64 1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
|
获取eth1网口ipV4地址
1 2
| ifconfig eth1|grep 'inet addr' | awk -F '[: ]+' '{print $4}' 192.168.1.1
|
计算文件大小
1 2
| ls -l *.txt | awk '{sum+=$5} END {print sum}' 46
|