Shell中的AWK

1.awk的工作原理

  • 逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
  • awk倾向于将一行分成多个"字段"然后再进行处理。
  • awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。
  • 使用awk命令的过程中,可以使用逻辑操作符"&&"表示"与"、"|"表示"或"、"!"表示"非",还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。

2.awk的命令格式

  1. awk 选项 '模式或条件 {操作}' 文件1 文件2 ....
  2.  
  3. 或者
  4. awk -f 脚本文件 文件1 文件2 .....

Shell中的AWK_第1张图片

 

  • 第一步:执行BEGIN{action;… }语句块中的语句
  • 第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ action;… }语句块,它逐行扫描文件,
  • 从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
  • 第三步:当读至输入流末尾时,执行END{action;…}语句块
  • BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中
  • END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块
  • pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块 

3.awk基础命令

3.1过滤出包含指定内容的行

Shell中的AWK_第2张图片

3.2  -F,指定分隔符,取列

Shell中的AWK_第3张图片

3.3  BEGIN

Shell中的AWK_第4张图片

3.4  END

Shell中的AWK_第5张图片

3.5  文件导入,打印内容

Shell中的AWK_第6张图片

Shell中的AWK_第7张图片

3.6  “计算机”

Shell中的AWK_第8张图片

3.7  awk取磁盘量

Shell中的AWK_第9张图片

Shell中的AWK_第10张图片

3.8  awk取IP地址

Shell中的AWK_第11张图片

4. awk 常见的内置变量

awk 选项 '模式{print }'

  • FS :指定每行文本的字段分隔符,缺省默认为空格或制表符(tab)。与 “-F”作用相同 -v "FS=:"

  • OFS:输出时的分隔符

  • NF:当前处理的行的字段个数

  • NR:当前处理的行的行号(序数)

  • $0:当前处理的行的整行内容

  • $n:当前处理行的第n个字段(第n列)

  • FILENAME:被处理的文件名

  • RS:行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n

-v:定义变量  awk  中的变量

-F:指定分隔符

4.1  FS

Shell中的AWK_第12张图片

Shell中的AWK_第13张图片

4.2  OFS

Shell中的AWK_第14张图片

4.3  RS

Shell中的AWK_第15张图片

4.4  NF

Shell中的AWK_第16张图片

Shell中的AWK_第17张图片

Shell中的AWK_第18张图片

4.5  NR

Shell中的AWK_第19张图片

Shell中的AWK_第20张图片

Shell中的AWK_第21张图片

Shell中的AWK_第22张图片

4.6 找普通用户

Shell中的AWK_第23张图片

4.7  FNR

Shell中的AWK_第24张图片

Shell中的AWK_第25张图片

Shell中的AWK_第26张图片

Shell中的AWK_第27张图片

5.自定义变量

printf   
%s:显示字符串
%d, %i:显示十进制整数
%f:显示为浮点数
%e, %E:显示科学计数法数值 
%c:显示字符的ASCII码
%g, %G:以科学计数法或浮点形式显示数值
%u:无符号整数
%%:显示%自身

##############做成一个表格###########################

awk -F:   'BEGIN{printf "--------------------------------\n%-20s|%10s|\n--------------------------------\n","username","uid"}{printf "%-20s|%10d|\n--------------------------------\n",$1,$3}' /etc/passwd

Shell中的AWK_第28张图片

6.模式匹配

awk '模式{处理动作}'

PATTERN:根据pattern条件,过滤匹配的行,再做处

Shell中的AWK_第29张图片

7.找到10:00 到 11:00之间的日志

awk      '/10/,/11/'        文件名

sed      -nr    '/10/,/11/p'        文件名

8.关系表达式

  • 关系表达式结果为“真”才会被处理
  • 真:结果为非0值,非空字符串
  • 假:结果为空字符串或0值

8.1  0为假;1为真

Shell中的AWK_第30张图片

8.2  n++

Shell中的AWK_第31张图片

8.3  !0

Shell中的AWK_第32张图片

8.4  i=!i

Shell中的AWK_第33张图片

8.5 !(i=!i)

Shell中的AWK_第34张图片

9.条件判断

  • if语句:awk的if语句也分为单分支、双分支和多分支
  • 单分支为if(判断条件){执行语句}
  • 双分支为if(判断条件){执行语句}else{执行语句}
  • 多分支为if(判断条件){执行语句}else if(判断条件){执行语句}else if(判断条件){执行语句}else if(判断条件){执行语句 

if条件判断

Shell中的AWK_第35张图片

10.  for  

Shell中的AWK_第36张图片

11.访问、赋值数值元素

Shell中的AWK_第37张图片

12.遍历数组

Shell中的AWK_第38张图片

13.小案例

1.  awk  '!line[$0]++'  test

Shell中的AWK_第39张图片

2.  用for循环,打印端口号信息

ss -natp| awk 'NR!=1{print  $1}'  | sort |uniq  -c

Shell中的AWK_第40张图片

ss -natp | awk  'NR!=1{a[$1]++}END{for(i in a)print  i,a[i]}'

Shell中的AWK_第41张图片

3.  提取下面的字段中的 IP地址和时间

58.87.87.99 - - [09/Jun/2020:03:42:43 +0800] "POST /wp-cron.php?doing_wp_cron=1591645363.2316548824310302734375 HTTP/1.1" ""sendfileon
128.14.209.154 - - [09/Jun/2020:03:42:43 +0800] "GET / HTTP/1.1" ""sendfileon
64.90.40.100 - - [09/Jun/2020:03:43:11 +0800] "GET /wp-login.php HTTP/1.1"""sendfileo
 

Shell中的AWK_第42张图片

Shell中的AWK_第43张图片

Shell中的AWK_第44张图片

4.  提取host.txt主机名后再放回host.txt文件

1 www.kgc.com
2 mail.kgc.com
3 ftp.kgc.com
4 linux.kgc.com
5 blog.kgc.com

Shell中的AWK_第45张图片

Shell中的AWK_第46张图片

Shell中的AWK_第47张图片

5.  统计/etc/fstab文件中每个文件系统类型出现的次数

Shell中的AWK_第48张图片

6.  统计/etc/fstab文件中每个真单词出现的次数

Shell中的AWK_第49张图片

7.  提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字

Shell中的AWK_第50张图片

8.  查出/tmp/的权限,以数字方式显示

Shell中的AWK_第51张图片

9.  查出用户UID最大值的用户名、UID及shell类型

Shell中的AWK_第52张图片

你可能感兴趣的:(linux,运维,服务器,mysql,ssh,git,网络)