查看原文
其他

正则表达式(9)-三剑客之awk(4)

Cloud研习社 Cloud研习社 2023-06-06


每周二、四、六定期更新!



模式pattern(即awk基本用法里提到的匹配规则)


pattern根据匹配规则匹配相应的行以后再做处理。
1. 不写,则每一行都处理


[root@studyclub jason]# awk -F: '{print $1}' /etc/passwd


2. /regular expression/  regular expression就是需要匹配的内容,这部分是正则表达式,也可以是字符串
# 匹配以root开头的行,并把这一行按照冒号作为分隔符对行进行分割以后,打印出第一个字段
[root@studyclub jason]# awk -F: '/^root/{print $1}' /etc/passwd
root

# 和上例相反,打印出不是以root开头的行的第一个字段
[root@studyclub jason]# awk -F: '!/^root/{print $1}' /etc/passwd
root

#


3. regular expression:关系表达式,结果为真才被处理
真:结果为非零或非空
假:结果为0或空
实例:
[root@studyclub jason]# awk -F: '$3>=0 && $3<1000 {print $1}' /etc/passwd

# 取出/etc/passwd的第三行。即NR为3的行。
[root@studyclub jason]# awk 'NR==3{print $0}' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin

# 找出容量大于500000的所有盘的大小
[root@studyclub jason]# df  | awk '!/^Filesystem/ && $2>
500000 {print $2}'
18765824

# 验证一下真假到底是什么:
[root@studyclub jason]# awk '" "' /etc/hosts # 空格不算空
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@studyclub jason]# awk '""' /etc/hosts # 双引号里没有东西才算空
[root@studyclub jason]# awk '0' /etc/hosts # 0为假
[root@studyclub jason]# awk '1' /etc/hosts # 非0才为真
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@studyclub jason]# awk '"0"' /etc/hosts # 此时0是字符串了,所以不是空
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6


作业:
请解析下面的命令为什么得出不同的结果:
[root@studyclub jason]# awk '++i{print i, $0}' /etc/hosts
1 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
2 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@studyclub jason]# awk 'i++{print i, $0}' /etc/hosts
2 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6


4. 行范围
/pat1/,/pat2/
# 打印行:从root开头的行到daemon开头的行全部打印
[root@studyclub jason]# awk '/^root/,/^daemon/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

# 打印前三行
[root@studyclub jason]# awk 'NR>=1 && NR<=3' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin


5. BEGIN/END模式
BEGIN{}处理文本之前执行一次
END{}处理文本之后执行一次
实例:
[root@studyclub jason]# awk -F: 'BEGIN{printf "%-16s | %s\n","username","UID";print "-----------------|------"}{printf "%-16s | %d\n",$1,$3}END{printf "======================\n"}' /etc/passwd
username | UID
-----------------|------
root | 0
......
chrony | 997
sun | 1501
======================



条件判断if-else


语法:

if (表达式 ) {
  语句;语句;...
}

if (表达式 ) {
  语句;语句;...
} else {
  语句;语句;...
}


实例演示:
# 只有一个if判断
[root@studyclub jason]# awk -F: '{if($3>=1000) {print $1,"common_user"}}' /etc/passwd
jason common_user
......
sun common_user

# 加上else判断
[root@studyclub jason]# awk -F: '{if($3>=1000) {print $1,"common_user"}else {print $1, "sysuser"}}' /etc/passwd
root sysuser
......
sun common_user


BTW,最近这段时间我们进入了shell相关知识的学习,也算是Linux里唯一的有点像编程基本语法的内容,难度相对较大,知识密度比较大,希望大家坚持住,看完以后多练习。


手应知:

    尝鲜Rocky Linux

《Linux基础及进阶》:

    063 - 正则表达式(4)-三剑客之grep    064 - 正则表达式(5)-三剑客之sed   065 - 正则表达式(6)-三剑客之awk(1)    066 - 正则表达式(7)-三剑客之awk(2)    067 - 正则表达式(8)-三剑客之awk(3)


看完本文有收获?请分享给更多人


推荐关注「Cloud研习社」,带你从零开始掌握云计算技术!

微信号|bjdream-1


Cloud研习社 · 

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存