麒麟操作系统基础知识保姆级教程(十二)三剑客之awk

如果你想拥有你从未拥有过的东西,那么你必须去做你从未做过的事情

接下来准备学习的是三剑客功能最强大的工具了,也是三剑客中的老大==》awk,和grep和sed不同,awk是编程语言,设计初衷也是为了提供一个比sed和grep更强大的工具,awk功能强大,占用的资源也会更多。

目录

awk的优势和劣势

三剑客awk

案例1、awk按行查找

案例2、模糊过滤文件的内容

案例3、awk取列

awk指定分隔符:默认以tab键或空格分离

案例4.awk模式+动作

小结

awk的优势和劣势

优势
    数据提取和处理能力强:awk 把文本看作是由记录(行)和字段(列)组成的表格,非常适合用于数据提取和处理。
    强大的编程功能:它是一种编程语言,具有变量、函数、条件语句和循环语句等编程结构。这使得它可以进行复杂的数据计算和转换。
    格式化输出方便:可以方便地对输出进行格式化。
    
劣势
    复杂性和资源消耗:由于 awk 是一种编程语言,对于简单的文本处理任务可能会显得过于复杂。而且,在处理大型文件或者复杂任务时,它的资源消耗(如内存和 CPU)可能比 grep 和 sed 要高。
    启动和执行时间可能较长:与 grep 的快速搜索相比,awk 在启动和执行过程中可能需要更多的时间,尤其是当脚本比较复杂或者文件比较大时。

三剑客awk

awk:编程语言 GNU/awk
作用:
    1.取行
    2.取列
    3.模糊过滤
    4.数据统计,数据运算
    5.支持for循环 if判断 数组……
    6.格式化输出 sed后向引用
语法结构
    awk '模式' file   #不加任何动作,默认为输出的动作
    awk '模式{print}' file  #模式+动作
    其他命令输出awk '模式'
模式:找谁,怎么找 指定行,指定列找,模糊过滤的找
三剑客支持扩展正则的方法
    1.grep -e或egrep
    2.sed -r
    3.awk  默认支持扩展正则

案例1、awk按行查找

语法结构:
        sed -n '3p' file  #sed 输出指定的行
        awk 'NR==3' file  #awk 输出指定的行
awk的内置变量:
NR存放着文件中每行的行号
NR的表达式:
==  等于第几行
>   大于第几行
<   小于第几行
>=  大于等于第几行
<=  小于等于第几行
!=  不等于
&&  并且
||  或者
1个等号在系统中被定义为变量
[root@yunzhongzi ~]# cat 1.txt
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
只显示文件的第三行
[root@yunzhongzi ~]# awk 'NR==3' 1.txt
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
只显示文件中小于3的行
[root@yunzhongzi ~]# awk 'NR<3' 1.txt
只显示文件中大于3的行
[root@yunzhongzi ~]# awk 'NR>3' 1.txt
显示文件中不等于3的行
[root@yunzhongzi ~]# awk 'NR!=3' 1.txt
&&并且:
[root@yunzhongzi ~]# awk 'NR>3&&NR<5' 1.txt
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
||或者:
[root@yunzhongzi ~]# awk 'NR<3||NR>4' 1.txt
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

案例2、模糊过滤文件的内容

语法结构:
        grep '' 文件
        sed -n '/内容/p' 文件
        awk '/内容/' 文件
        awk '//,//' 文件
案例1.查找包含root的行
[root@yunzhongzi ~]# awk '/root/' 1.txt
1 root:x:0:0:root:/root:/bin/bash
案例2.查找以1开头的行
[root@yunzhongzi ~]# awk '/^1/' 1.txt
1 root:x:0:0:root:/root:/bin/bash
以h结尾
[root@yunzhongzi ~]# awk '/h$/' 1.txt
1 root:x:0:0:root:/root:/bin/bash
以1 r开头
[root@yunzhongzi ~]# awk '/^1 r/' 1.txt
1 root:x:0:0:root:/root:/bin/bash
包含1 r
[root@yunzhongzi ~]# awk '/1 r/' 1.txt
1 root:x:0:0:root:/root:/bin/bash
以1/2/3开头
[root@yunzhongzi ~]# awk '/^[1-3]/' 1.txt
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
案例3.区间范围工作中取时间范围较多
[root@yunzhongzi ~]# awk '/^2/,/4/' 1.txt
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin

案例3、awk取列

语法结构:
        awk '{print $n}' file
$0      awk的内置变量里面存放着每行的内容
$1      表示第一列 默认以空格和tab键为分隔符,如果没有空格和tab那么文件原本内容为第一列
$2      表示第二列
,逗号,内置变量,表示空格
NF      表示最后一列的列号
$NF     表示最后一列的内容
注意:所有的字符串在awk中被识别为变量,所以输出字符串必须加双引号""
先创建测试环境
[root@yunzhongzi yunzhongzi]#head /etc/passwd >1.txt  #将/etc/passwd的前十行重定向到当前目录的1.txt文件
[root@yunzhongzi yunzhongzi]#sed -i 's#:# #g' 1.txt   #使用sed将文件中的冒号":"修改为空格(awk默认以空格分列)
[root@yunzhongzi yunzhongzi]#cat 1.txt 
root x 0 0 root /root /bin/bash
bin x 1 1 bin /bin /sbin/nologin
daemon x 2 2 daemon /sbin /sbin/nologin
adm x 3 4 adm /var/adm /sbin/nologin
lp x 4 7 lp /var/spool/lpd /sbin/nologin
sync x 5 0 sync /sbin /bin/sync
shutdown x 6 0 shutdown /sbin /sbin/shutdown
halt x 7 0 halt /sbin /sbin/halt
mail x 8 12 mail /var/spool/mail /sbin/nologin
operator x 11 0 operator /root /sbin/nologin
[root@yunzhongzi yunzhongzi]#
​
案例1.显示文件第一列
[root@yunzhongzi yumzhongzi]#awk '{print $1}' 1.txt
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
[root@yunzhongzi yumzhongzi]#
​
案例2.显示第1列和第3列
[root@yunzhongzi yunzhongzi]#awk '{print $1,$3}' 1.txt 
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
operator 11
​
案例3.   先输出第三列,后输出第一列
[root@yunzhongzi yunzhongzi]#awk '{print $3,$1}' 1.txt 
0 root
1 bin
2 daemon
3 adm
4 lp
5 sync
6 shutdown
7 halt
8 mail
11 operator
[root@yunzhongzi yunzhongzi]#
​
案例4.输出最后一列内容
[root@yunzhongzi yunzhongzi]#awk '{print NF}' 1.txt 
7
7
​
案例5.取磁盘中的第5列
[root@yunzhongzi yunzhongzi]# df -h|awk '{print $5}'
Use%
0%
0%
案例6.取出sda3的方法
​
[root@yunzhongzi yunzhongzi]#df -h |awk 'NR==6'
/dev/mapper/klas-root   36G  3.6G   33G   10% /
​
案例7.取出倒数第二列
[root@yunzhongzi yunzhongzi]#df -h |awk '{print $(NF-1)}'
已用%
0%
0%
3%
0%
​
案例8.取出每行倒数第2列的内容
[root@yunzhongzi yunzhongzi]#awk '{print $(NF-1)}' 1.txt
/root
/bin
/sbin
/var/adm
/var/spool/lpd
/sbin
/sbin
/sbin
/var/spool/mail
/root
awk指定分隔符:默认以tab键或空格分离
刚才取列时,我使用到了sed替换的方式分列的,但是有一个直接指定分隔符的方式
​
案例1.取出第一列
[root@yunzhongzi yunzhongzi]#awk -F: '{print $1}' test.txt 
root
bin
daemon
adm
lp
​
案例2.取出最后一列
[root@yunzhongzi yunzhongzi]#awk -F: '{print $NF}' test.txt 
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
​
案例3.指定多分隔符
[root@yunzhongzi yunzhongzi]#awk -F ":/" '{print $2}' test.txt 
root
bin
sbin
​
案例4.+连续出现1次或1次以上作为一个整体
[root@yunzhongzi yunzhongzi]#awk -F "[:/]+" '{print $5,$6}' 1.txt
nologin 
sbin nologin
sbin nologin
[root@yunzhongzi yunzhongzi]#

案例4.awk模式+动作

案例1.取出第3行第3列
[root@yunzhongzi ~]# awk -F: 'NR==3{print $3 }' 1.txt 
2
案例2.取出用户名和最后一列
[root@yunzhongzi ~]# awk -F "[ :]" '{print $2,$NF }' 1.txt
root /bin/bash
bin /sbin/nologin
[root@yunzhongzi ~]# awk -F "[ :]" '{print $2"\t"$NF }' 1.txt
root    /bin/bash
bin     /sbin/nologin
案例3.取出磁盘使用行的第4列
[root@yunzhongzi ~]# df -h |awk 'NR==6{print $4}'
16G
[root@yunzhongzi ~]# df -h |awk 'NR==6{print $4,$1}'
16G /dev/sda3
案例4.拼接(没必要)
[root@yunzhongzi ~]# df -h |sed -n '/sda3/p'|awk '{print $4}'
16G
案例5.取出dev相关行的第一列和最后一列
[root@yunzhongzi ~]# df -h |awk 'NR>5&&NR<8{print $1,$NF}'
/dev/sda3 /
/dev/sda1 /boot
案例6.字符串比对
[root@yunzhongzi ~]# awk -F: '$NF=="/bin/bash"' 1.txt
1 root:x:0:0:root:/root:/bin/bash
案例7.查找以ro开头的行
[root@yunzhongzi ~]# awk -F: '/^ro/' 1.txt
root:x:0:0:root:/root:/bin/bash
案例8.数字比较
[root@yunzhongzi ~]# awk -F: '/^ro/' 1.txt
root:x:0:0:root:/root:/bin/bash
[root@yunzhongzi ~]#  awk -F: '$3>0' 1.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@yunzhongzi ~]# awk -F: '$3<2' 1.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@yunzhongzi ~]# awk -F: '$3<=2' 1.txt
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@yunzhongzi ~]# awk '$2>=90' 2.txt |wc -l
3
[root@yunzhongzi ~]# awk '$2>90' 2.txt |wc -l
3

小结

 1.awk取行
awk 'NR==3' file
 NR==
 NR!=
 NR>=
 NR<=
 NR>
 NR<
 &&
 ||
 2.awk模糊过滤
awk '/过滤的内容/' file
 awk '//,//' file
支持正则
3.awk取列
awk '{print $1}' file
 awk '{print $NF}' file 最后一列
4.awk指定分隔符
awk -F:
 awk -F ":"
 awk -F "[:/]+"
 5.awk模式+动作
awk 'NR==6{print $3}'
 awk '//{print $3}'
 6.字符串比较
awk '$3=="root"' file
 awk '$3!="root"' file 不等于
7.awk数值比较
 awk '$3==0' file
 awk '$3>90' file
 awk '$3>80&&$3<90' file
 || 或者

好了,关于linux系统三剑客的相关知识就分享就到这里了,至于下篇文章分享什么?想好再决定喽~~~~


想成为大佬,就要从小白开始,从0开始,一点一点的积累,慢慢成长,明天你就是大佬!!想学习更多麒麟操作系统的知识,关注小屁,让你成为运维老鸟~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值