shell之路 Linux正则工具【第三篇】文本处理三剑客之awk
作用
查找或修改符合模式匹配规则(pattern)的所有行或列
强大的地方在于支持编程语法(变量、流程控制、输入输出、函数、数组)
虽然功能强大,但一般用来做字符分割
命令格式
第一种形式: awk 'BEGIN{}pattern{commands}END{}' file
第二种形式: standard output |awk 'BEGIN{}pattern{commands}END{}'
说明
BEGIN{} 正式处理数据之前执行 pattern 匹配模式 {commands} 处理命令,可能多行 END{} 处理完所有数据后执行
变量
内置变量
$0 打印行所有信息 $1~$n 打印行的第1到n个字段的信息(常用) NF 处理行的字段个数(常用) NR 处理行的行号 FNR 多文件处理时,每个文件单独记录行号 FS 字段分割符,不指定时默认以空格或tab键分割(常用) RS 行分隔符,不指定时以回车换行分割(常用) OFS 输出字段分隔符 ORS 输出行分隔符(默认是换行符\n) FILENAME 处理文件的文件名 ARGC 命令行参数个数 ARGV 命令行参数数组
注意:awk中的变量不需要先声明或赋值就能直接使用,默认就会有个初始值
语法简化
1.指定分隔符可以用-F选项,省略BEGIN
2.'BEGIN{}pattern{commands}END{}'可以写进文件file.awk,用awk -f file.awk代替
准备文件
cp /etc/passwd passwd # 这里将/etc/passwd文件复制一份到操作目录下
/etc/passwd文件,这里开启了行号显示,行号并不是内容
passwd文件
打印某列
统计每行的列数
打印行号
单文件
多文件
分隔符高级用法
文件名和参数个数
可以看到,有个问题,有多少行输出多少次(这个问题后续解决)
格式化输出
格式说明符
格式符 %s 打印字符串(常用) %d 打印10进制数(常用) %f 打印浮点数 %x 打印16进制数 %o 打印8进制数 %e 打印数字的科学计数法 %C 格式打印单个字符的ASCII码 修饰符 - 左对齐 + 右对齐 # 显示8进制在前面加0,显示16进制在前面加0x
print与printf
%s与\n
%ns
n代表占位数
默认右对齐
对齐方式
左对齐
更多demo
以字符串格式打印passwd中的第7个字段,以":"作为分隔符
以10进制格式打印passwd中的第3个字段,以":"作为分隔符
以浮点数格式打印passwd中的第3个字段,以":"作为分隔符
awk模式匹配的两种用法
第一种方法: RegExp 第二种方法:运算符匹配
RegExp
运算符匹配
关系运算符匹配: < 小于 > 大于 <= 小于等于 >= 大于等于 == 等于 != 不等于 ~ 匹配正则表达式 !~ 不匹配正则表达式
(1)、以:为分隔符,匹配passwd文件中第3个字段小于50的所有行信息 awk ' BEGIN{FS=":"}$3<50{print $0}' passwd (2)、以:为分隔符,匹配passwd文件中第3个字段大于50的所有行信息 awk ' BEGIN{F=":"}$3>50{print $0}' passwd (3)、以:为分隔符,匹配passwd文 件中第7个字段为/bin/bash的所有行信息 awk 'BEGIN{FS=":"}$7=="/bin/bash"{print $0}' passwd (4)、以:为分隔符,匹配passwd文件中第7个字段不为/bin/bash的所有行信息 awk 'BEGIN{FS=":"}$7!="/bin/bash"{print $0}' passwd (5)、以:为分隔符,匹配passwd文件中第3个字包含3哥以上数字的所有行信息 awk 'BEGIN{FS=":"}$3~/[0-9]{3,}/{print $0}' passwd
布尔运算符匹配: 或|| 与&& 非!
(1)、以:为分隔符,匹配passwd文件中包含nobody或Nobody的所有行信息 awk 'BEGIN{FS=":"}$1=="nobody" || $1=="Nobody" {print $0}' passwd (2)、以:为分隔符,匹配文件中第3个字段小于50并且第7个字段匹配到/bin/bash的所有行 awk 'BEGIN{FS=":"}$3<50 && $7~/\/bin\/bash/ {print $0}' passwd
awk的表达式
算数运算符: + 加 - 减 * 乘 / 除 % 取模 ^或** 乘方 ++x 先加1再赋值 x++ 先赋值再加1 --x 先减1再赋值 x-- 赋值再减1
awk流程控制
条件语句
语法格式
if(条件表达式) ... else if ... else ...
简化语法
循环语句
do while一般不用,因为可以用while代替
语法格式
while循环: while(条件表达式) ... do while循环: do ... while(条件表达式) for循环: for(初始化计数器;计数器测试;计数器变更) ... for(i in array) ...
awk中的字符串函数
length(str) 计算长度 index(str1,str2) 返回在str1中查询到的str2的位置 tolower(str) 小写转换 toupper (str) 大写转换 split(str ,arr,fs) 分隔字符串,并保存到数组中 match (str, RE) 返回正则表达式匹配到的子串的位置 substr (str ,m,n) 截取子串,从m个字符开始,截取n位。n若不指定,则默 sub (RE , RepStr, str) 替换查找到的第一一个子串 gsub (RE ,RepStr,str) 替换查找到的所有子串
统计分割符内的单词字符数
awk使用shell变量
-v参数
awk中的数组
在awk中,使用数组时,不仅可以使用数字作为下标,还可以使用字符串作为下标
统计各个TCP状态的连接数有多少
总结
grep sed awk均为文本处理工具,按行处理,功能从前到后依次更为强大
谢谢