专题(十四)awk

一、背景

     awk 在 linux 服务器 上是处理 字符串的,对于 字符串中获取想要的 子字串方面是一个比较好的工具。

二、用法

1、选项

     

选项 说明 备注
-F 一行中的字符串的分割符

不指定的时候默认是按照空格进行分割

可以指定多个分割符

-F '[ ,]'  表示先按照空格分割,对分割后的结果再按照 , 分割

-v 设置变量 可以用于 '' 中
-f    执行的 awk 脚本文件  
     
     

awk -option '表达式',其中表达式是必填的内容,基本用法都是用 awk 进行字符串切割,获取第几列的数据,如: awk -F ':' '{print $1}' ,表示按照 : 分割每行内容,打印分割后的每行的 第一列

2、表达式

3、内建变量

 这里的 内建变量 主要用 在 '表达式' 中,如 ‘{print $n}’ ,展示第 n 列。

4、AWK 脚本

关于 awk 脚本,我们需要注意两个关键词 BEGIN 和 END。

  • BEGIN{ 这里面放的是执行前的语句 }
  • END {这里面放的是处理完所有的行后要执行的语句 }
  • {这里面放的是处理每一行时要执行的语句}

 1) 在 awk 命令里面直接 使用 Begin End 等

如上图中的示例,表示: 先打印表头 + 分行符  (BEGIN{ }),然后针对每行{ }的内容进行处理

2) 直接写一个 awk 脚本

$ cat score.txt
Marry   2143 78 84 77
Jack    2321 66 78 45
Tom     2122 48 77 71
Mike    2537 87 97 95
Bob     2415 40 57 62
$ cat cal.awk
#!/bin/awk -f
#运行前
BEGIN {
    math = 0
    english = 0
    computer = 0
 
    printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL
"
    printf "---------------------------------------------
"
}
#运行中
{
    math+=$3
    english+=$4
    computer+=$5
    printf "%-6s %-6s %4d %8d %8d %8d
", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
END {
    printf "---------------------------------------------
"
    printf "  TOTAL:%10d %8d %8d 
", math, english, computer
    printf "AVERAGE:%10.2f %8.2f %8.2f
", math/NR, english/NR, computer/NR
}
$ awk -f cal.awk score.txt
NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL
---------------------------------------------
Marry  2143     78       84       77      239
Jack   2321     66       78       45      189
Tom    2122     48       77       71      196
Mike   2537     87       97       95      279
Bob    2415     40       57       62      159
---------------------------------------------
  TOTAL:       319      393      350
AVERAGE:     63.80    78.60    70.00

以上示例来自:https://www.runoob.com/linux/linux-comm-awk.html

三、示例

1、打印所有列(默认按空格分割)

ps -ef|grep ssh |awk '{print $0}'

 2、打印最后一列(默认按空格分割)

ps -ef|grep ssh |awk '{print $NF}'

 若想打印倒数第二列 则 为 $(NF-1) ,以此类推。

3、按照 : 分割,打印第一列

date |awk -F ':' '{print $1}'

 4、打印倒数第二列,按照 : 分割

date |awk -F ':' '{print $(NF-1)}'

 5、打印多列,如打印 第2列和第3列

date |awk -F ':' '{print $2,$3}'

 6、打印N列之后的所有列(按空格分割)

awk '{for(i=1;i<=N;i++){$i=""}; print $0}' file

其原理是将其前N行全部设置为空,再打印全部

7、指定多个分割符,再按照多个分割符分割之后,打印第5列

date |awk -F '[ :]' '{print $5}'

示例表示:先按照空格分割,多分割后的结果再按照 : 分割,最后打印第5列

 8、显示当前的分(仅显示当前时间中的分)+10,同时显示当前的分+单位

date |awk -F ':' -va=10 -vb=m '{print $2+a,$2b}'

这里设置了变量 a=10,b=m;对 date 显示出的时间按照 : 进行分割,同时获取分割后的第二列也就是 分,对其进行+10操作 和 显示带单位

 9、表达式的使用

由上可以总结出  awk option '表达式'  ,其中 '表达式' 在以上的例子上都用于 {print $N}  指定输出列了, 其实 '表达式' 可以有多种内容,并非仅仅用于指定输出列

test.txt 文件内容为:

1 xiaohong 33
2 xiaoming 22
3 tiantian 32

1)  显示第一列中大于1的所有行

awk '$1>1' test.txt

表达的意思是:仍然按照空格进行分割,显示第一列的数值大于1的所有行,由于这里在表达式中没有指定输出列,因此输出所有列

 2) 显示第一列中大于1且第三列大于30的所有行

awk '$1>1 && $3>30' test.txt

表达的意思是:仍然按照空格进行分割,显示第一列的数值大于1且第三列大于30的所有行,由于这里在表达式中没有指定输出列,因此输出所有列

 3) 显示第一列中大于1且第三列大于30的所有行,但仅显示第2列

awk '$1>1 && $3>30 {print $2}' test.txt

表达的意思是:仍然按照空格进行分割,显示第一列的数值大于1且第三列大于30的行中的第2列

 10、内建变量的使用

1) 指定展示第3行

awk 'NR==3' test.txt

 表达的意思:以空格作为分割符,展示第3行的数据

原文地址:https://www.cnblogs.com/sandyflower/p/15270866.html