awk
awk 是行处理器: 相比较屏幕处理的优点, 在处理庞大文件时不会出现内存溢出或是处理缓慢的问题, 通常用来格式化文本信息
awk 处理过程: 依次对每一行进行处理, 然后输出
awk 命令形式:
awk [-F|-f|-v] BEGIN{} //{command1; command2} END{} file
[-F|-f|-v] 大参数,-F 指定分隔符,-f 调用脚本,-v 定义变量 var=value
' ' 引用代码块
BEGIN 初始化代码块, 在对每一行进行处理之前, 初始化代码, 主要是引用全局变量, 设置 FS 分隔符
// 匹配代码块, 可以是字符串或正则表达式
{} 命令代码块, 包含一条或多条命令
; 多条命令使用分号分隔
END 结尾代码块, 在对每一行进行处理之后再执行的代码块, 主要是进行最终计算或输出结尾摘要信息
一 awk 工作原理:
1. 首先, 执行 BEGIN{action statements}语句块中的语句;
2. 其次, 从文件中或者从标准输入读取一行, 然后执行 pattern{action statements}语句块; 逐行重复处理该过程, 直到数据全部被读取完毕;
3. 在其他语句执行完成后, 在退出 awk 程序之前, 执行 END{action statements}语句块;
注意:
1).BEGIN 语句块在 awk 开始处理数据之前就需要执行; 此语句块是可选语句块;
2).END 语句块在 awk 处理完所有的数据之后, 才会被执行; 此语句块是可选语句块;
3).pattern 语句块中的通用命令是最重要的部分, 也是可选的; 如果没有提供 pattern 语句块, 则默认执行 { print } 语句, 显示数据的每一行; awk 读取到的每一行都会执行一次 pattern 语句块的内容;
二特殊要点:
$0 表示整个当前行
$1 每行第一个字段
NF 字段数量变量
NR 每行的记录号, 多文件记录递增
FNR 与 NR 类似, 不过多文件记录不递增, 每个文件都从 1 开始
\t 制表符
\n 换行符
FS BEGIN 时定义分隔符
RS 输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~ 匹配, 与 == 相比不是精确比较
!~ 不匹配, 不精确比较
== 等于, 必须全部相等, 精确比较
!= 不等于, 精确比较
&& 逻辑与
|| 逻辑或
+ 匹配时表示 1 个或 1 个以上
/[0-9][0-9]+/ 两个或两个以上数字
/[0-9][0-9]*/ 一个或一个以上数字
FILENAME 文件名
OFS 输出字段分隔符, 默认也是空格, 可以改为制表符等
ORS 输出的记录分隔符, 默认为换行符, 即处理结果也是一行一行输出到屏幕
-F'[:#/]' 定义三个分隔符
三常用的 ACTION:
1.print: 标准格式显示;
print item1,item2,...
print 命令的要点:
a. 逗号分隔;
b. 输出的各 item 可以是字符串, 可以是数字, 可以是当前记录中的字段, 可以是变量, 可以是 awk 表达式;
c. 如果省略了 item, 就输出整行, 相当于{print $0};
示例:
- ~]# awk -F: '{print $1,$3,$7}' /etc/passwd
- ~]# echo -e "1 2 3\n4 5 6\n7 8 9" | awk '{print $2}'
2. 变量:
内建变量:
FS:input field seperator, 输入字段分隔符, 默认空白字符;
示例:
~]# awk -v FS=':' '{print $1}' /etc/passwd
OFS:outpit field seperator, 输出字段分隔符, 默认空白字符;
示例:
~]# awk -v FS=':' -v OFS=':' '{print $1,$3}' /etc/passwd
RS:input record seperator, 输入记录分隔符, 默认换行符;
注意: 即使指定了新的输入记录分隔符, 原换行符仍然有效;
示例:
~]# awk -v RS='/' '{print $0}' /etc/passwd
ORS:output record seperator, 输出记录分隔符;
NF:number of field, 字段数量;
示例:
- ~]# awk -v FS=':' '{print NF}' /etc/passwd
- ~]# awk -v FS=':' '{print $NF}' /etc/passwd
- ~]# awk -v FS=':' '{print $(NF-1)}' /etc/passwd
NR:number of record, 行数; 鉴于 awk 遍历文件每行的特性, 可以将该变量理解为行号;
示例:
~]# awk '{print NR}' /etc/passwd
FNR:file number of record, 分别统计各个文件的行数, 行号;
示例:
~]# awk '{print FNR}' /etc/passwd /etc/fstab
FILENAME: 输出当前正在处理的文件的文件名;
示例:
~]# awk '{print FILENAME}' /etc/passwd /etc/fstab
ARGC:argument count, 整个命令行中的参数的数量; 包括命令本身;
示例:
~]# awk '{print ARGC}' /etc/passwd /etc/fstab /etc/issue
ARGV: 数组, argument value, 保存了命令行中各个参数的具体内容;
示例:
~]# awk '{print ARGV[1]}' /etc/passwd /etc/fstab /etc/issue
自定义变量:
定义方式:
-v var=value
注意: 变量名区分字符大小写;
示例:
~]# awk -v var1='hello' -F: '{print var1 ,$1}' /etc/passwd
3.printf 命令:
格式化输出命令: printf "FORMAT" item1,item2,...
要点:
1) 必须给出合适的 FORMAT;
2) 默认不自动换行, 需要显式给出换行控制符(\n);
3) FORMAT 中需要为后面的每一个 item 指定一个格式化符号;
格式符:
%c: 显示字符的 ASCII 码;
%d,%i: 显示十进制整数;
%f: 显示浮点数字;
%e,%E: 使用科学计数法显示数字;
%g,%G: 使用科学计数法显示浮点数字;
%s: 显示字符串;
%u: 显示无符号整数;
%%: 显示 % 自身;
修饰符:
#[.#]: 第一个数字用来控制显示宽度; 第二个数字表示小数点的精度;
如:%3.1f %5s
-: 表示采用左对齐机制; 默认是右对齐; %-15s
+: 显示数字的正负符号;%+d
示例:
~]# awk -F: '{printf"%-20s: %-5s\n",$1,$3}' /etc/passwd
4. 操作符:
算术操作符:
x+y, x-y, x*y, x/y, x^y, x%y
-x: 将正数转换为负数;
+x: 将字符串转换为数值;
字符串操作符:
没有符号的操作符, 表示字符串连接之意;
赋值操作符:
- =, +=, -=, *=, /=, %=, ^=
- ++, --
比较操作符:
>,>=, <, <=, ==, !=
模式匹配操作符:
~: 左侧的字符串是否能够被右侧的模式所匹配;
!~: 左侧的字符串是否不能够被右侧的模式所匹配;
示例:
- ~]# awk -F: '$3==1000{print $0}' /etc/passwd
- ~]# awk -F: '$NF~/bash/{print $0}' /etc/passwd
逻辑操作符:
- &&
- ||
- !
示例:
~]# awk -F: '$3>=500&&$3<=1000{print}' /etc/passwd
条件表达式:
condition(selector)?if-true-expression:if-false-expression
示例:
- ~]# awk -F: '{$3>=1000?usertype="Common User":usertype="Super or System User";printf"%-20s: %-20s\n",usertype,$1}' /etc/passwd
- 5.PATTERN:
1) empty: 空模式, 处理文件中的每一行;
2) [!]/REGEXP/: 仅处理 [不] 能被 PATTERN 匹配到的行;
示例:~]# awk '[!]/^r/{print}' /etc/passwd
3) 关系表达式:$3>=1000, $NF~/bash/
4) 行的范围:
关系表达式:($3>=500&&$3<=1000)
/regexp1/,/regexp2/: 从被 regexp1 匹配的行开始到被 regexp2 匹配的行结束, 有多少这一类匹配结果, 就显示多少次;
示例:~]# awk '/^r/,/^a/{print}' /etc/passwd
5) BEGIN/END 模式:
BEGIN{}: 仅在开始处理文件中的第一行文本之前执行一次的语句块;
示例:
~]# awk -F: 'BEGIN{printf"%20s %5s\n","Username","UserID"}{printf"%20s %5s\n",$1,$3}' /etc/passwd
注意: 在输出特定格式的表头时, 常用此语句块;
END{}: 仅在文本处理完成但命令尚未退出时执行一次的语句块;
示例:
~]# awk -F: 'BEGIN{printf"%20s %5s\n","Username","UserID"}{printf"%20s %5s\n",$1,$3}END{print"========================\n",NR" users"}' /etc/passwd
6. 常用的 ACTION:
1. 表达式(Expression)
2. 组合语句(Cpmpound Statement)
3. 输入语句(Input Statement)
4. 输出语句(Output Statement)
5. 控制语句(Control Statement)
7. 控制语句:
- if (condition) statement [ else statement ]
- while (condition) statement
- do statement while (condition)
- for (expr1; expr2; expr3) statement
- for (var in array) statement
- break
- continue
- delete array[index]
- delete array
- exit [ expression ]
- { statements }
- switch (expression) {case value|regex : statement...[ default: statement ]}
- 1) if-else:
语法: if (condition) {statement} [ else {statement} ]
使用场景: 对 awk 取得的整行或某个字段做条件判断;
示例:
~]# awk -F: '{if($3>=1000) {print $1} else {print $1,$3}}' /etc/passwd
2) while 循环: 条件为真, 进入循环; 条件为假, 退出循环;
语法: while (condition) statement
使用场景: 对一行内的多个字段逐一做类似的处理时; 对数组中的各个元素遍历及处理时;
示例:
~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {printf"%s: %d\n",$i,length($i);i++}}' /etc/grub2.cfg
3) do...while 循环:
语法: do statement while (condition)
意义: 同 while 循环, 但至少执行一次循环体中的语句;
4) for 循环:
语法: for (expr1; expr2; expr3) statement
expr1: 变量赋初值;
expr2: 条件判断;
expr3: 变量值的递增或递减调整;
示例:
~]# awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {printf"%s: %d\n",$i,length($i)}}' /etc/grub2.cfg
5) break 和 continue
break [n]
continue: 跳过本次循环, 直接进入下次循环;
6) next 语句:
提前结束对本行的处理, 而直接进入下一行;
示例:
~]# awk -F: '{if($3%2!=0) next;print $1,$3}' /etc/passwd
8. 数组(Array)
关联数组: array[index_expression]
index_expression:
1) 可以使用任意的字符串, 字符串必须使用双引号;
2) 如果某数组元素事先不存在, 当引用该元素时, awk 会自动创建此元素, 并且为该元素赋 "空字符串" 作为其初始值;
注意: 如果想要判断数组中某个元素是否存在, 一般会使用 "index in array" 格式进行;
示例:
~]# awk 'BEGIN{name["leader"]="zhang";name["mem1"]="li";name["mem2"]="wang";print name["leader"]}'
查看已连接状态下, 同一客户端的连接数量:
~]# ss -tn | awk '/^ESTAB\>/{print $NF}' | awk -F: '{state[$1]++}END{for(s in state){print state[s],s}}'
9. 函数:
内建函数:
length(): 计算字符串长度
split(string,array[,fieldsep])
来源: http://www.bubuko.com/infodetail-2537315.html