Linux命令-awk

Linux命令—awk

awk不仅仅时linux系统中的一个命令,而且是一种编程语言,可以用来处理数据和生成报告(excel)。处理的数据可以是一个或多个文件,可以是来自标准输入,也可以通过管道获取标准输入,awk可以在命令行上直接编辑命令进行操作,也可以编写成awk程序来进行更为复杂的运用。

本章主要讲解awk命令的运用

awk格式

1
awk [option] 'PATTERN{ACTION STATEMENTS}' FILE

awk

  • 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

Linux命令-awk
https://carl-5535.github.io/2020/12/16/Linux命令/Linux命令-awk/
作者
Carl Chen
发布于
2020年12月16日
许可协议