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文件,这里开启了行号显示,行号并不是内容

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

passwd文件

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

打印某列

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

统计每行的列数

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

打印行号

单文件

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

多文件

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

分隔符高级用法

 shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

文件名和参数个数

可以看到,有个问题,有多少行输出多少次(这个问题后续解决)

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

格式化输出

格式说明符

格式符
	%s	打印字符串(常用)
	%d	打印10进制数(常用)
	%f	打印浮点数
	%x	打印16进制数
	%o	打印8进制数
	%e	打印数字的科学计数法
	%C	格式打印单个字符的ASCII码

修饰符
	-	左对齐
	+	右对齐
	#	显示8进制在前面加0,显示16进制在前面加0x

print与printf  

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

%s与\n

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

%ns

n代表占位数

默认右对齐

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

对齐方式

左对齐

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

更多demo

以字符串格式打印passwd中的第7个字段,以":"作为分隔符

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

 以10进制格式打印passwd中的第3个字段,以":"作为分隔符

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

以浮点数格式打印passwd中的第3个字段,以":"作为分隔符

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

awk模式匹配的两种用法

第一种方法: RegExp
第二种方法:运算符匹配

RegExp

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

运算符匹配

关系运算符匹配:
<  小于
>  大于
<=  小于等于
>=  大于等于
==  等于
!=  不等于
~  匹配正则表达式
!~  不匹配正则表达式

 

(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

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

awk流程控制

条件语句

语法格式

if(条件表达式)
	...
else if
	...
else
	...

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

简化语法

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

循环语句

do while一般不用,因为可以用while代替

语法格式

while循环:
	while(条件表达式)
		...

do while循环:
	do
		...
	while(条件表达式)
	
for循环:
	for(初始化计数器;计数器测试;计数器变更)
		...
		
	for(i in array)
		... 

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

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)		替换查找到的所有子串

 

统计分割符内的单词字符数

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

 

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

awk使用shell变量

-v参数

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

awk中的数组

在awk中,使用数组时,不仅可以使用数字作为下标,还可以使用字符串作为下标

 

统计各个TCP状态的连接数有多少

shell之路 Linux正则工具【第三篇】文本处理三剑客之awk

总结

grep sed awk均为文本处理工具,按行处理,功能从前到后依次更为强大

 

转载于:https://www.cnblogs.com/hyit/articles/4760567.html