ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

007 Linux 命令三剑客之-awk

2022-01-26 20:33:35  阅读:209  来源: 互联网

标签:commands END BEGIN NF State 007 awk 三剑客


01 一起来认识 awk!

Linux 命令三剑客,sed、grep、awk。

  • sed:擅长数据修改。
  • grep:擅长数据查找定位。
  • awk:擅长数据切片,数据格式化,功能最复杂。

awk 更适合格式化文本,对文本进行较复杂格式处理,awk 程序对输入文件的每一行进行操作。awk 是一门解释型的编程语言。文本处理、输出格式化的文本报表、执行算数运算、执行字符串操作等等。

02 awk 完整命令格式

BEGIN { …. initialization awk commands …}{ …. awk commands for each line of the file…}END { …. finalization awk commands …}
  • BEGIN{} 语句块在程序的开头执行,它只执行一次,在这里可以初始化变量。BEGIN 是 awk 的关键字,因此它必须为大写,注意,这个语句块是可选的;
  • 主{ }部分,没有关键字,运行处理文件的每一行执行的命令;
  • END 语句块在程序的最后执行,END 是 awk 的关键字,因此必须为大写,它也是可选的。

03 awk 间隔符(分隔符)

  • awk 将每一行视为由多个字段组成,每个字段由"间隔符"分隔。默认情况下"间隔符" 是一个或多个空格字符,因此行:this is a line of text 包含6个字段。在 awk 中,第一个字段称为 $1,第二个字段称为 $2,以此类推,整行称为 $0。
  • awk 内置变量 FS 可以设置间隔符,如设置 FS=":",则它将根据':'作为间隔符。

04 awk 内置变量及可选参数

【内置变量】

  • FS # 输入字段的分隔符
  • NR # 当前行号,已读的记录数
  • NF # 当前行中的字段数量
  • $NF # NF 当前行中的字段数量(行参数数量),假如行参数有六个,那么NF=6,重点来了,如果我要取当前行的最后一个参数,使用 "$6" 和 "$NF" 都能取到最后一个参数,也就是说 $6=$NF=第6个参数值。

【常用可选参数】

  • -v # 赋值一个用户定义变量
  • -f # 从脚本文件中读取 awk 命令
  • -F # 相当于内置变量 FS

05 awk 模式匹配

  • awk 可以对任何文件进行操作,包括 std-in,在这种情况下,它通常与 '|' 命令一起使用,例如,结合 grep,cat 或其他命令。
  • awk 是一种面向行的语言。首先是模式,然后是动作。操作语句用" {} "括起来。
  • awk 模式包括正则表达式 (使用与“grep -E”相同的语法) 和使用的组合特殊符号 “&&” 表示“逻辑AND ”,“||”表示“逻辑或”,“!” 的意思是“逻辑不”。

06 awk 控制语句

awk 'BEGIN{ commands } pattern{ commands } END{ commands }'

eg:统计指定ip和端口号,各种 tcp 连接状态的数量

netstat -n | grep 1.2.3.4:22 | awk '/^tcp/ {++State[$NF]} END {for (i in State) print i, State[i]}'
  • 命令中,^tcp用于匹配开头包含tcp字符的文本行;
  • $NF 指的是每行最后一个字段,数组State[$NF]就是以最后一个字段为下标指向一个存储单元或者说变量,此处代表该字段的统计结果, 也就是++的意义所在, 统计值自增一。
  • END不能缺少表示END符号之后的指令于处理所有行结束时执行。
  • i是字段,State[i]即为统计结果,每行处理完成则State[$NF] 加1。

07 awk 常用实践

  • 统计文本行数
awk 'END  {print NR}' warn.log #统计 warn.log 文件行数。
  • 指定以 , 为分隔符;输出为 hello world。
    文本内容如下:
    hello,world,awk,!
awk -F, '{print $1,$2}' info.log # -F, 指定以逗号分隔。
  • 实现计算表达式
awk 'BEGIN{print  115+100}'

08 小结

awk 命令,擅长文本格式化处理,这里只是起到一个抛砖引玉的作用,awk 语法较为复杂,感兴趣的可以深入学习,当然你也可以用 python 等语言来做一些脚本任务的处理。

「不甩锅的码农」原创,转载请注明来源,未经授权禁止商业用途!同名 GZH 请关注!

标签:commands,END,BEGIN,NF,State,007,awk,三剑客
来源: https://www.cnblogs.com/bilahepan/p/15848046.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有