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均为文本处理工具,按行处理,功能从前到后依次更为强大

 

posted @ 2015-08-26 15:32  沐风先生  阅读(303)  评论(0编辑  收藏  举报