AWK工具的基本语法及应用

简介

  • Awk是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于Shell脚本,完成各种自动化配置任务。

一、awk工具介绍

  • 功能强大的编辑工具;
  • 无交互的情况下实现复杂的文本操作。

命令格式:

awk 选项 '模式或条件{编辑指令}' 文件1 文件2...	//过滤并输出文件中符合条件的内容
awk -f 脚本文件 文件1 文件2...				//从脚本中调用编辑指令,过滤并输出内容
  • 若需要查找出/etc/passwd的用户名、用户ID、组ID等列,执行以下awk命令即可
[root@localhost ~]# awk -F ':' '(print $1,$3,$4}' /etc/passwd
root 0 0
bin 1 1
dacmn 2 2//省略部分内容

二、awk工作原理

  • 逐行读取文本,默认以空格为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。

在这里插入图片描述

三、awk特殊的内建变量

  • FS:指定每行文本的字段分隔符,默认为空格或制表位;
  • NF:当前处理的行的字段个数;
  • NR:当前处理的行的行号(序数);
  • $0:当前处理的行的整行内容;
  • $n:当前处理行的第n个字段(第n列);
  • FILENAME:被处理的文件名;
  • RS:数据记录分隔,默认\n,即每行为一条记录。

四、awk的用法示例

  • 按行输出文本;按字段输出文本;通过管道、双引号调用shell命令

4.1 按行输出文本

[root@localhost ~]# awk '{print}' test.txt			//输出所有内容,等同于_cat test.txt
[root@localhost ~]# awk '{print $0}' test.txt		//输出所有内容,等同于cat test.txt
[root@localhost ~]# awk 'NR==1, NR==3{print}' test.txt		//输出第1~3行内容
[root@localhost ~]# awk '(NR>=1)&&(NR<=3){print}' test.txt	//输出第1~3行内容
[root@localhost ~]# awk 'NR==1||NR==3 {print}' test.txt		//输出第1行、第3行内容
[root@localhost ~]# awk '(NR%2)==1{print}' test.txt			//输出所有奇数行的内容
[root@localhost ~]# awk '(NR%2)==0{print}' test.txt			//输出所有偶数行的内容
[root@localhost ~]# awk '/^root/{print]' /etc/passwd		//输出以root开头的行
[root@localhost ~]# awk '/nologin$/{print}' /etc/passwd		//输出以nologin结尾的行
[root@localhost ~]# awk 'BEGIN{x=0};/\/bin\/bash$/{x++};END{print x}' /etc/passwd
						//统计以/bin/bash 结尾的行数
[root@localhost ~]# grep -c "/bin/bash$" /etc/passwd 			//也是统计以/bin/bash结尾的行数
[root@localhost ~]# awk 'BEGIN{RS=""};END{print NR}' test.txt	//统计以空行分隔的文本段落数			
  • 若需要统计用户登录系统的个数,可以用两种方法实现:
    均使用管道符号调用命令wc -l
[ root@localhost ~]# awk -F: '/bash$/{print}' /etc/passwd / wc -l
5		//表示登录系统用户数
[ root@localhost ~]# awk -F: '/bash$/{print | "wc -l"}' /etc/passwd
5		//表示登录系统用户数

4.2 按字段输出文本

[root@localhost ~]# awk '{print $3}' test.txt			//输出每行中(以空格或制表位分隔)的第3个字段
[root@localhost ~]# awk '{print $1,$3]' test.txt		//输出每行中的第1、3个宁段
[root@localhost ~]# awk -F ":" '$2==""{print}' /etc/shadow			//输出密码为空的用户的shadow记录
[root@localhost ~]# awk 'BEGIN{FS=":"};S2==""{print}' /etc/ shadow	//输出密码为空的用户的shadow记录
[root@localhost ~]# awk -F ":" '$7~"/bash"{print $1}' /etc/passwd
								//输出以冒号分隔且第7个字段中包含/bash的行的第1个字段,注:~表示当前用户的意思
[root@localhost ~]# awk '(Si~"nfs")&&(NF==8) {print $1, $2}' /etc/services 
								//输出包含8个字段且第1个字段中包含 nfs 的行的第1、2个字段
[root@localhost ~]# awk F ":" '($7!="/bin/bash")&&($7!="/sbin/nologin"){print}' /etc/passwd
								//输出第7个字段既不为 /bin/bash 也不为 /sbin/nologin 的所有行

4.3 通过管道、双引号调用shell命令

[root@localhost ~]# awk -F: '/bash$/{print | "wc -l"}' /etc/passwd		//调用wc -l命令统计使用bash的用户个数
[root@localhost ~]# grep -c "bash$" /etc/passwd							//也是统计使用bash的用户个数
[root@localhost ~]# awk 'BEGIN {while ("w" | getline) n++ ; {print n-2}}' 	//调用w命令,并用来统计在线用户数
[root@localhost ~]# awk 'BEGIN{"hostname" | getline ; print $0}'			//调用hostname,并输出当前的主机名
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值