13.Linux三剑客之awk

文章目录

1.语法

awk [参数] [处理规则] [操作对象]

2.参数

-F : 指定文本分隔符(默认是以空格作为分隔符)
	awk -F'f' '{print $NF}' 9.txt

3.生命周期

grep读一行处理一行,直至处理完成。
(sed和awk也是)
1、接收一行作为输入
2、把刚刚读入进来得到文本进行分解
3、使用处理规则处理文本
4、输入一行,赋值给$0,直至处理完成
5、把处理完成之后的所有的数据交给END{}来再次处理

4.预定义变量

$0	: 代表当前行
# 在每行后面加是 ---
[root@localhost ~]# awk -F: '{print $0, "---"}' /etc/passwd

image-20211223191111908

$n	:代表第n列
# 打印第第一列
[root@localhost ~]# awk -F: '{print $1}' /etc/passwd

image-20211223191213708

NF  :记录当前行的字段数
# 查看第一行的列数
[root@localhost ~]# awk -F: '{print NF}' /etc/passwd
7
# 展示最后一行
[root@localhost ~]# awk -F: '{print $NF}' /etc/passwd

image-20211223191454293

NR	:用来记录行号
[root@localhost ~]# awk -F: '{print NR}' /etc/passwd

image-20211223191828741

FS  :指定文本内容分隔符(默认是空格)
FS 的优先级要高于 -F
"""
vi 1.txt
a::b::c::d
:wq
"""
[root@localhost ~]# awk 'BEGIN{FS="::"}{print $NF}' 1.txt
d

image-20211223192610227

OFS :指定打印分隔符(默认空格)
[root@localhost ~]# awk -F: 'BEGIN{OFS=" >>> "}{print $NF, $1}' /etc/passwd

image-20211223192633402

5.处理规则顺序

1.BEGIN{}		
2.//
3.{}
4.END{}

6.输入

输出在{}函数中使用.
print	: 打印
printf	:格式化打印
    %s	: 字符串
    %d	:数字
    -   :左对齐
    +   :右对齐
    15  : 至少占用15字符
# 格式化输出
[root@localhost ~]# awk -F: 'BEGIN{OFS="|"}{printf "|%+15s|%-15s|\n", $NF,$1}' /etc/passwd
|      /bin/bash|root           |
|  /sbin/nologin|bin            |
|  /sbin/nologin|daemon         |
...

image-20211223193138804

7.正则表达式

[root@localhost ~]#  awk -F: '/root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

image-20211223193238477

8.比较表达式

>
<
>=
<=
~		正则匹配
!~       正则匹配(取反)
8.1练习1
打印属组ID大于属主ID的行
[root@localhost ~]# awk -F: '$4 > $3{print $0}' /etc/passwd

image-20211223193645444

8.2练习2
结尾包含bash的行
# 把行尾的字段取出来在做正则匹配
[root@localhost ~]# awk -F: '$NF ~ /bash/{print $0}' /etc/passwd

image-20211223194828996

8.3练习3
结尾不包含bash的行
# 把行尾的字段取出来在做取反的正则匹配
[root@localhost ~]# awk -F: '$NF !~ /bash/{print $0}' /etc/passwd

9.算术表达式

+
-
*
/
%
9.1练习1
属主id号 + 属组id > 2000
[root@localhost ~]# awk -F: '$3 + $4 > 2000{print $0}' /etc/passwd
9.2练习2
属主id号 * 属组id > 2000
 awk -F: '$3 * $4 > 2000{print $0}' /etc/passwd
9.3练习3
打印偶数行
[root@localhost ~]# awk -F: 'NR % 2 == 0{print $0}' /etc/passwd
9.4练习4
打印奇数行
[root@localhost ~]# awk -F: 'NR % 2 == 1{print $0}' /etc/passwd

10.逻辑表达式

&&	: 逻辑与
||  :逻辑或
!	:逻辑非
10.1练习1
属主id号 + 属组id > 2000 $$ 属主id号 * 属组id > 2000
[root@localhost ~]# awk -F: '$3 + $4 > 2000 && $3 * $4 > 2000{print $0}' /etc/passwd
10.2练习2
属主id号 + 属组id > 2000 || 属主id号 * 属组id > 2000
[root@localhost ~]# awk -F: '$3 + $4 > 2000 || $3 * $4 > 2000{print $0}' /etc/passwd
10.3练习3
!(属主id号 + 属组id > 2000)
[root@localhost ~]# awk -F: '!($3 + $4 > 2000){print $0}' /etc/passwd

11.条件表达式

==
>
<
>=
<=
11.1练习1
打印第三行
[root@localhost ~]# awk -F: 'NR == 3{print $0}' /etc/passwd

12.范围表达式

'//,//' 
从某个条件开始到某个条件结束.
[root@localhost ~]# awk -F: '/^root/,/^ftp/{print $0}' /etc/passwd

13.流程控制

13.1if判断
if(){}
if(){}else{}
if(){}else if(){}else{}
[root@localhost ~]# awk -F: '{if($3>$4){print "大于"}else{print "不大于"}}' /etc/passwd
13.2while循环
[root@localhost ~]# awk -F: '{i=1; while(i<10){print $0, i++}}' /etc/passwd
13.3for循环
for(i="初始值";条件判断;游标){}
[root@localhost ~]# awk -F: '{if(NR%5==0){print "----------------"}print $0}' /etc/passwd

14.练习

1、找出/proc/meminfo文件中以s开头的行,至少用三种方式(忽略大小写)
[root@localhost ~]# grep -E '^[sS]' /proc/meminfo 
[root@localhost ~]# sed -r -n '/^[sS]/p' /proc/meminfo
[root@localhost ~]# awk '/^[sS]/{print $0}' /proc/meminfo
[root@localhost ~]# grep -iE '^s' /proc/meminfo 
2、显示当前系统上的以root,centos或者user开头的信息
[root@localhost ~]# grep -rE '^(root|centos|user)' /etc/
3、找出/etc/init.d/functions文件下包含小括号的行
[root@localhost ~]# grep -E '\(|\)' /etc/init.d/functions 
4、输出指定目录的基名
[root@localhost /etc/sysconfig]# pwd | awk -F/ '{print $NF}'
5、找出网卡信息中包含的数字
[root@localhost /etc/sysconfig]# grep -oE '[0-9]+' /etc/sysconfig/network-scripts/ifcfg-ens3[23]
6、找出/etc/passwd下每种解析器的用户个数
{"bash": 10, "sh": 9, "zsh": 1}
数组
[root@localhost /etc/sysconfig]# awk -F: '{arr[$NF]++}END{for(i in arr){print i,arr[i]}}' /etc/passwd
7、获取网卡中的ip,用三种方式实现
[root@localhost /etc/sysconfig]# ip a | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}'
[root@localhost /etc/sysconfig]# ip a | sed -r -n '/([0-9]{1,3}\.){3}[0-9]{1,3}/p'
[root@localhost /etc/sysconfig]# ip a | awk '/([0-9]{1,3}\.){3}[0-9]{1,3}/{if(NR==3){print $2}else{print $2,$4}}'
8、搜索/etc目录下,所有的.html或.php文件中main函数出现的次数
[root@localhost ~]# grep -rE 'main' `find /etc/ -name "*.html" -o -name "*.php" | xargs ` | wc -l
9、过滤掉php.ini中注释的行和空行
[root@localhost ~]# yum install php php-devel
[root@localhost ~]# grep -vE '^\ *;|^$' /etc/php.ini 
10、找出文件中至少有一个空格的行
[root@localhost ~]# grep -E '\ +' /etc/php.ini
11、过滤文件中以#开头的行,后面至少有一个空格
[root@localhost ~]# grep -E '^#\ +' /etc/fstab 
12、查询出/etc目录中包含多少个root
[root@localhost ~]# grep -roE 'root' /etc/ | wc -l
13、查询出所有的qq邮箱
[root@localhost ~]# grep -E '[0-9a-zA-Z-_]+@qq\.com'
14、查询系统日志中所有的error
[root@localhost ~]# grep -E 'error' /var/log/messages
15、删除某文件中以s开头的行的最后一个词
[root@localhost ~]# grep -Ei '^s' 11.txt | grep -oE '[0-9a-zA-Z]+' | xargs | awk '{for(i=0;i<(NF-1);i++){print $i}}'
16、删除一个文件中的所有数学
[root@localhost ~]# sed -r 's/[0-9]//g' 11.txt 
17、显示奇数行
[root@localhost ~]# awk -F: 'NR%2==1{print $0}' /etc/passwd
18、删除passwd文件中以bin开头的行到nobody开头的行
[root@localhost ~]# sed -r '/^bin/,/^nobody/d' /etc/passwd
19、从指定行开始,每隔两行显示一次空行
[root@localhost ~]# awk -F: '{if(NR>5){print $0; if(NR%2){print ""}}}' /etc/passwd
20、每隔5行打印一个空行
[root@localhost ~]# awk -F: '{print $0;if(NR%5==0){print ""}}' /etc/passwd
21、不显示指定字符的行
[root@localhost ~]# grep -vE 'g' x.txt 
22、将文件中1到5行中aaa替换成AAA
[root@localhost ~]# sed -r '1,5s/aaa/AAA/g' x.txt
23、显示用户id为奇数的行
[root@localhost ~]# awk -F: '$3%2==1{print $0}' /etc/passwd
24、显示系统普通用户,并打印系统用户名和id
[root@localhost ~]# awk -F: '$3>=1000{print $1, $3}' /etc/passwd
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值