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 请关注!