【Linux学习笔记28-3】Shell文本处理工具之 awk

1. awk简介


awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势


2. awk命令


基本结构:
awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file

  1. BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,
  2. 这三个部分是可选的。任意一个部分都可以不出现在脚本中,脚本通常是被单引号或双引号中

/条件/	#条件
/条件1|条件2/	#条件1或者条件2
/条件1/||/条件2/	#条件1或者条件2
/条件1/&&/条件2/	#条件1并且条件2

awk 选项
-F
指定输入分隔符
-f
从脚本文件中读取awk命令

awk 内置变量
NR
行数
NF
列数
FILENAME
文件名称
“FILENAME”
字符串
$0
所有的列
$1
第一列(数字为几,就是第几列)
$2
第二列
^$
空值

awk 运算符
||
逻辑或
&&
逻辑与
~
匹配正则表达式
~!
不匹配正则表达式
$
字段引用
空格
字符串连接符

>>正则表达式详解



3. awk 用法示例


显示行号,列数

awk '{print NR}' passwd	#显示文件行号
awk '{print $0}' passwd	#显示文件每一列
awk '{print NR" "$0}' passwd	#显示文件行号和内容,中间有空格
awk -F : '{print NF}' passwd	#显示每行的列数(以:为分隔符)

在这里插入图片描述

变量值与字符串区别

#无双引号为变量
awk -F : '{print FILENAME}' passwd	#显示文件名称
#有双引号为字符串
awk -F : '{print “FILENAME”}' passwd	#显示字符串

在这里插入图片描述

条件使用示例

awk '/bash$|sh$/' /etc/passwd	#显示文件以bash或sh结尾的行
awk -F : '/bash$|sh$/{print $1}' /etc/passwd	#显示指定内容的第一列
awk -F : '/bash$|sh$/&&/^root/{print $1}' /etc/passwd	#以bash或sh结尾的并且以root开头的行的第一列
awk -F : '/bash$|sh$/&&!/^root/{print $1}' /etc/passwd	#以bash或sh结尾的并且不是以root开头的行的第一列

在这里插入图片描述

值为空与不为空的行

#第五列值为空的行
awk -F : '$5~/^$/{print}' /etc/passwd
#第五列值不为空的行
awk -F : '$5!~/^$/{print}' /etc/passwd

在这里插入图片描述


awk基本结构示例

#执行BEGIN的内容,显示第5列为空的行,执行END内容
awk -F : 'BEGIN{print "hello"}$5~/^$/{print}END{print "111"}' /etc/passwd
#BEGIN定义n,显示第5列为空的行,最后输出n值
awk -F : 'BEGIN{n=0}$5~/^$/{print}END{print n}' /etc/passwd
#BEGIN定义n,每遇到第5列为空的行 执行n++,最后输出n值
awk -F : 'BEGIN{n=0}$5~/^$/{n++}END{print n}' /etc/passwd
#BEGIN定义n,逐行执行n++,最后输出n值
awk -F : 'BEGIN{n=0}{n++}END{print n}' /etc/passwd

在这里插入图片描述



4. 测试


统计在系统中能su-切换的并且用户家目录不在/home下的用户数量


#能su-切换的用户
awk -F : '/bash$|sh$/{print}' /etc/passwd
#用户家目录不在/home下的用户
awk -F : '$6!~/^\/home/{print}' /etc/passwd
#能su-切换的并且用户家目录不在/home下的用户
awk -F : '/bash$|sh$/&&$6!~/^\/home/{print}' /etc/passwd
#在系统中能su-切换的并且用户家目录不在/home下的用户数量
awk -F : 'BEGIN{n=0}/bash$|sh$/&&$6!~/^\/home/{n++}END{print n}' /etc/passwd

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_46069582/article/details/111499884