1. awk简介
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势
2. awk命令
基本结构:
awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file
- BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,
- 这三个部分是可选的。任意一个部分都可以不出现在脚本中,脚本通常是被单引号或双引号中
/条件/ #条件
/条件1|条件2/ #条件1或者条件2
/条件1/||/条件2/ #条件1或者条件2
/条件1/&&/条件2/ #条件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
版权声明:本文为weixin_46069582原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。