如果你想拥有你从未拥有过的东西,那么你必须去做你从未做过的事情
接下来准备学习的是三剑客功能最强大的工具了,也是三剑客中的老大==》awk,和grep和sed不同,awk是编程语言,设计初衷也是为了提供一个比sed和grep更强大的工具,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开始,一点一点的积累,慢慢成长,明天你就是大佬!!想学习更多麒麟操作系统的知识,关注小屁,让你成为运维老鸟~~~~