关注上方浩道linux,回复资料,即可获取海量linux、Python、网络通信等学习资料!
前言
大家好,这里是浩道linux,主要给大家分享linux、python、网络通信相关的IT知识平台。
熟悉linux的都知道,linux中有著名的三个命令,即grep、sed、awk。这三个命令被称为linux三剑客。三剑客包含各种招式众多,熟练掌握这三个命令的用法,将大大提高我们对文件的处理速度,大大提升运维效率。
本文通过具体实例,给大家分享linux三剑客grep、sed、awk相关的精妙招式,让你真正融合三剑客相关的武功招式,真正快速行走于linux江湖之中,做一个人人敬仰的侠客。
一、linux三剑客之grep
我通常把grep的招式比作横扫千军式,是因为它可以在众多文件中找到你想要的任何一个关键部分,这就类似于千军万马中取谁首级就取谁的!
grep是一种文本搜索工具,它通过用户指定的过滤条件(模式),对目标文本进行逐行匹配检查,打印出匹配到的行。
1、grep命令用法如下:
grep [参数选项] [过滤条件] 文件
其常见的参数选项如下:
-V:表示排除匹配结果;
-n:表示显示匹配行与行号;
-i:表示不区分大小写,即忽略大小写进行匹配;
-c:表示只统计匹配的行数;
-E:表示支持使用扩展的正则表达式元字符。
-w:表示只匹配过滤到的单词;
-o:表示只输出匹配到的内容;
--color=auto:表示为过滤结果添加颜色。
2、grep实战场景---
以下通过实战让大家对grep招式不再陌生。
1)找出文件haodao.txt中与haodao有关的内容,并且忽略大小写,命令如下:
[root@haodaolinux1 ~]# grep -i "haodao" haodao.txt
HAODAO
haodao1:x:1000:1000::/home/haodao1:/bin/bash
haodao2:x:1002:1002::/home/haodao2:/bin/bash
haodao3:x:1003:1003::/home/haodao3:/bin/bash
2)找出文件haodao.txt中与haodao有关的内容,并且忽略大小写,加上行号显示,命令如下:
[root@haodaolinux1 ~]# grep -i -n "haodao" haodao.txt
6:HAODAO
29:haodao1:x:1000:1000::/home/haodao1:/bin/bash
35:haodao2:x:1002:1002::/home/haodao2:/bin/bash
36:haodao3:x:1003:1003::/home/haodao3:/bin/bash
3)统计出文件haodao.txt中与haodao有关内容的行,忽略大小写,并且只显示行数,命令如下:
[root@haodaolinux1 ~]# grep -i -c "haodao" haodao.txt
4
4)找出文件haodao.txt中存在的空行,并且将行号打印出来,命令如下:
[root@haodaolinux1 ~]# grep "^$" haodao.txt -n
4:
8:
12:
14:
5)找出文件haodao.txt中存在的空行,并且将空行排除,打印除空行外的内容,命令如下:
[root@haodaolinux1 ~]# grep "^$" haodao.txt -n -v
1:root:x:0:0:root:/root:/bin/bash
2:ROOT:x:1:1:bin:/bin:/sbin/nologin
3:root
5:ROOT
6:HAODAO
7:haohao
9:haohaolinux
10:daemon:x:2:2:daemon:/sbin:/sbin/nologin
11:#linux
13:#12345678
15:adm:x:3:4:adm:/var/adm:/sbin/nologin
16:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
17:sync:x:5:0:sync:/sbin:/bin/sync
18:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
19:halt:x:7:0:halt:/sbin:/sbin/halt
20:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
21:operator:x:11:0:operator:/root:/sbin/nologin
22:games:x:12:100:games:/usr/games:/sbin/nologin
23:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
24:nobody:x:99:99:Nobody:/:/sbin/nologin
25:avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
26:systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
27:systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin
28:dbus:x:81:81:System message bus:/:/sbin/nologin
29:polkitd:x:997:995:User for polkitd:/:/sbin/nologin
30:tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
31:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
32:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
33:haodao1:x:1000:1000::/home/haodao1:/bin/bash
34:mysql:x:1001:1001::/home/mysql:/sbin/nologin
35:zabbix:x:996:992:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
36:apache:x:48:48:Apache:/opt/rh/httpd24/root/usr/share/httpd:/sbin/nologin
37:ntp:x:38:38::/etc/ntp:/sbin/nologin
38:tcpdump:x:72:72::/:/sbin/nologin
39:haodao2:x:1002:1002::/home/haodao2:/bin/bash
40:haodao3:x:1003:1003::/home/haodao3:/bin/bash
6)找出文件haodao.txt中,没有以#开头的行,并且也不是空行的内容,命令如下:
grep "^#" haodao.txt -v |grep "^$" -v
3、grep正则表达式元字符集整理:
^ :锚定行的开始 如:’^grep’匹配所有以grep开头的行。
$ :锚定行的结束 如:’grep$’匹配所有以grep结尾的行。
. :匹配一个非换行符的字符 如:’gr.p’匹配gr后接一个任意字符,然后是p。
* :匹配零个或多个先前字符 如:’*grep’匹配所有一个或多个空格后紧跟grep的行。
[] :匹配一个指定范围内的字符,如'[Gg]rep’匹配Grep和grep。
[^] :匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep’匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。
.* :一起用代表任意字符。
.. :标记匹配字符,如’love’,love被标记为1。
\<word :以某单词开头
word\> :以某单词结尾
x/{m/} :重复字符x,m次,如:’0\{5\}’匹配包含5个o的行。
x\{m,\} :重复字符x,至少m次,如:’o\{5,\}’匹配至少有5个o的行。
x\{m,n\} :重复字符x,至少m次,不多于n次,如:’o\{5,10\}’匹配5–10个o的行。
\w :匹配文字和数字字符
\b :单词锁定符,如: ‘\bgrep\b’只匹配grep。
4、grep结合正则表达式用法:
1)在文件haodao.txt中找出以haodao结尾的行,命令如下:
[root@haodaolinux1 ~]# grep -n "haodao$" haodao.txt
21:operator:x:11:0:operator:/root:/sbin/haodao
28:dbus:x:81:81:System message bus:/:/sbin/haodao
32:sshd:x:74:74:Privilege-separated SSH:haodao
2)找出文件haodao.txt中包含大写字母有关的行,命令如下:
[root@haodaolinux1 ~]# grep -n [A-Z] haodao.txt
2:ROOT:x:1:1:bin:/bin:/sbin/nologin 5:ROOT 6:HAODAO 23:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin24:nobody:x:99:99:Nobody:/:/sbin/nologin25:avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin 26:systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin 27:systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin 28:dbus:x:81:81:System message bus:/:/sbin/haodao 29:polkitd:x:997:995:User for polkitd:/:/sbin/nologin 30:tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin 32:sshd:x:74:74:Privilege-separated SSH:haodao
二、linux三剑客之sed
sed简称流编辑器,即stream editor的缩写。sed是一个操作、过滤和转换文本内容的强大工具。常用的功能有通过结合正则表达式对文件实现快速的增删改查。最常用的查询功能是过滤(过滤指定字符串)、取行(取出指定行)。
1、sed常用语法如下:
sed [选项参数] [sed内置命令字符] 文件
1)sed常用参数选项如下:
-n:表示取消默认的sed输出,通常与sed内置命令p一起使用;
-i:表示直接将修改结果写入文件,如果不加-i,sed修改的是内存数据;
-e:表示多次编辑,不需要管道符号;
-r:表示支持正则表达式;
2)sed内置的命令字符,主要是用于对文件进行增删改查等操作,常见内置命令字符有:
a:表示对文本进行追加操作,在指定行后面添加一行或多行文本;
d:表示删除匹配行;
i:表示插入文本,在指定行前添加一行或多行文本;
p:表示打印匹配行内容,通常与-n一同使用;
s/正则/替换内容/g:表示匹配正则内容,然后替换内容(支持正则表达式),结尾g表示全局匹配;
3)sed匹配范围主要有:
空地址:表示全文处理;
单地址:表示指定文件某一行;
/pattern/:表示被模式匹配到的每一行;
范围区间:如12,22表示十二行到二十二行,如12,+5表示第12行向下5行;
步长:如1~2,表示1,3,5,7,9行;2~2,表示2,4,6,8,10行;
2、以下通过实际例子来练习,加深大家对sed命令的用法。
准备一个haotest01.txt文件,文件内容如下:
1)通过sed命令输出1行向下4行的数据,
1)通过sed命令输出1行向下4行的数据,命令如下所示:
[root@haodaolinux1 ~]# sed "1,+4p" -n haotest01.txt
He is a good BOY.
she is a girl !
I have a dream.
We will study linux.
we will study Python.
2)通过sed命令输出文件中的4到6行数据,命令如下所示:
[root@haodaolinux1 ~]# sed "4,6p" -n haotest01.txt
We will study linux.
we will study Python.
So we will go study together.
3)通过sed命令输出有study字符串的行,命令如下所示:
[root@haodaolinux1 ~]# sed "/study/p" -n haotest01.txt
We will study linux.
we will study Python.
So we will go study together.
4)通过sed命令将文件中的good修改替换为bad,并且输出,命令如下所示:
[root@haodaolinux1 ~]# sed "s/good/bad/g" haotest01.txt
He is a bad BOY.
she is a girl !
I have a dream.
We will study linux.
we will study Python.
So we will go study together.
[root@haodaolinux1 ~]# cat haotest01.txt
He is a good BOY.
she is a girl !
I have a dream.
We will study linux.
we will study Python.
So we will go study together.
此时发现只是修改输出,原文件并没有实际替换成功,这是因为sed只是修改替换内存中的数据,要加上-i才能修改原文件内容,命令如下所示:
[root@haodaolinux1 ~]# sed "s/good/bad/g" -i haotest01.txt
[root@haodaolinux1 ~]# cat haotest01.txt
He is a bad BOY.
she is a girl !
I have a dream.
We will study linux.
we will study Python.
So we will go study together.
[root@haodaolinux1 ~]#
如果需要在一行中多次编辑替换多个地方的数据,则要在每个sed编辑语句前加带-e选项参数。
5)通过sed命令在文件的第3行下追加一行数据,内容为:we he he,命令如下所示:
[root@haodaolinux1 ~]# sed "3a we he he" -i haotest01.txt
替换后原文件内容如下图所示:
这里是通过内置命令符a在指定行下面追加,如果需要在指定行上面加,则要内置命令符i
如果需要在指定行下追加多行数据,可以在数据中需要换行的地方添加换行符号\n
6)sed匹配范围空地址的使用,即通过sed命令,在每一行的下面追加5个*,命令如下所示:
[root@haodaolinux1 ~]# sed "a *****" -i haotest01.txt
追加后内容如下图所示:
三、linux三剑客之awk
awk相对于其它两个剑客,功能稍微强大点。其有着强大的文本格式化能力,对文本进行复杂处理,造就了它独有绝招,同时awk还是一门编程语言,支持条件判断、数组、循环等功能。
1、awk语法如下:
awk [选项参数] '模式[动作]' 文件
这里的动作主要是指awk对文本的一些格式化处理,并且输出格式化处理后的结果,常见有print等,动作写在命令的{}里面。
1)awk常见参数有:
-F:表示指定分隔符
-v:表示定义或修改一个awk内置变量;
-f:表示从脚本中读取awk命令;
2)awk有很多内置变量,可以通过man awk查看,以下是常见的内置变量:
$0:表示完整的输入记录;
$n:表示指定分隔符后,当前指定的第n个字段;
FS:表示字段输入分隔符,默认以空格为分隔符;
OFS:表示字段输出分隔符;
NF:表示字段的个数,即以分隔符分割后,当前行一共有多少个字段;
NR:表示当前记录数,即行数;
awk涉及内容或语法比较多,想要一篇文章学完是不带现实,以下通过实例讲解它常见的那些招式,让你在日常工作中足以应付自如。
2、准备一个haotest02.txt文件,内容如下所示:
先执行以下awk命令,如下所示:
[root@haodaolinux1 ~]# awk '{print $0}' haotest02.txt
haodao1 haodao2 haodao3
haodao4 haodao5 haodao6
haodao7 haodao8 haodao9
[root@haodaolinux1 ~]# awk '{print $1}' haotest02.txt
haodao1
haodao4
haodao7
[root@haodaolinux1 ~]# awk '{print $2}' haotest02.txt
haodao2
haodao5
haodao8
[root@haodaolinux1 ~]#
通过以上awk命令,针对动作{print $0}这里代表一整行输出,针对动作{print $1}代表第一列输出,针对动作{print $2}代表第二列输出。
awk默认是以空格符为分隔符,不管有多少个空格,也会当成一个来处理。
awk是按行处理文件的,一行处理完毕后,再处理下一行,并且是根据用户指定的分隔符去处理,没有指定分隔符的,则默认以空格来当作分隔符。
1)针对haotest02.txt文件,输出第1列,第3列的内容,命令如下所示:
[root@haodaolinux1 ~]# awk '{print $1$3}' haotest02.txt
haodao1haodao3
haodao4haodao6
haodao7haodao9
[root@haodaolinux1 ~]# awk '{print $1 $3}' haotest02.txt
haodao1haodao3
haodao4haodao6
haodao7haodao9
[root@haodaolinux1 ~]# awk '{print $1,$3}' haotest02.txt
haodao1 haodao3
haodao4 haodao6
haodao7 haodao9
[root@haodaolinux1 ~]#
对比看出,动作中$1和$3用逗号,可以以空格输出。
可以添加自定义内容进行输出,如下命令所示:
[root@haodaolinux1 ~]# awk '{print "第1列为:"$1,"第2列为:"$3}' haotest02.txt
第1列为:haodao1 第2列为:haodao3
第1列为:haodao4 第2列为:haodao6
第1列为:haodao7 第2列为:haodao9
[root@haodaolinux1 ~]#
2)针对haotest02.txt文件,输出第1行内容,命令如下所示:
[root@haodaolinux1 ~]# awk 'NR==1{print $0}' haotest02.txt
haodao1 haodao2 haodao3
[root@haodaolinux1 ~]#
3)针对haotest02.txt文件,输出第2行到第3行的内容,命令如下所示:
[root@haodaolinux1 ~]# awk 'NR==2,NR==3{print $0}' haotest02.txt
haodao4 haodao5 haodao6
haodao7 haodao8 haodao9
4)针对haotest02.txt文件,输出第2行到第3行的内容,并且加上行号,命令如下所示:
[root@haodaolinux1 ~]# awk 'NR==2,NR==3{print NR,$0}' haotest02.txt
2 haodao4 haodao5 haodao6
3 haodao7 haodao8 haodao9
[root@haodaolinux1 ~]#
5)针对haotest02.txt文件,输出第1列的内容,并且显示出字段数(总列数),命令如下所示:
[root@haodaolinux1 ~]# awk '{print $1,NF}' haotest02.txt
haodao1 3
haodao4 3
haodao7 3
[root@haodaolinux1 ~]#
6)针对haotest02.txt文件,输出第1列和最后一列的内容,命令如下所示:
[root@haodaolinux1 ~]# awk '{print $1,$(NF)}' haotest02.txt
haodao1 haodao3
haodao4 haodao6
haodao7 haodao9
[root@haodaolinux1 ~]#
3、自定义分隔符,进行文件格式化后输出。
准备一个haotest03.txt文件,内容如下所示:
1)通过指定输入分隔符,如以:为输入分隔符,输出文件第一列的内容,命令如下所示:
[root@haodaolinux1 ~]# awk -F ":" '{print $1}' haotest03.txt
root
bin
daemon
ntp
tcpdump
haodao2
haodao3
[root@haodaolinux1 ~]#
或者通过修改系统默认输入分隔符变量(FS),进行输出,命令如下所示:
[root@haodaolinux1 ~]# awk -v FS=':' '{print $1}' haotest03.txt
root
bin
daemon
ntp
tcpdump
haodao2
haodao3
[root@haodaolinux1 ~]#
2)通过修改默认输出分隔符变量(OFS),输出文件第一列和最后一列内容,并且两列之间就是通过输出分隔符隔开的,命令如下所示:
[root@haodaolinux1 ~]# awk -F ":" -v OFS='*****' '{print $1,$NF}' haotest03.txt
root*****/bin/bash
bin*****/sbin/nologin
daemon*****/sbin/nologin
mail*****/sbin/nologin
ntp*****/sbin/nologin
tcpdump*****/sbin/nologin
haodao2*****/bin/bash
haodao3*****/bin/bash
[root@haodaolinux1 ~]#
结语
本文通过各种实例引出三剑客各自独有的武功招式,就类似给大家呈现了绝世剑谱。俗话说的好,勤能补拙。了解江湖的都知道,一个武林高手,即所得武功绝不是一日就可以达成。必须通过不断磨练,方能成就他日的非凡成就。所以针对以上三剑客的精华妙招,我们也要通过自己不断去敲命令,方能为自己所用,真正成为武林高手!
往期精彩内容回顾
总监给新员工开出了18K高薪,而不愿为6年工龄的我涨薪3K!
linux中如果不清楚2>&1怎么用,那说明你还不懂shell
更多精彩
关注公众号「浩道linux」
浩道linux,专注于linux系统的相关知识、网络通信、python相关知识以及涵盖IT行业相关技能的学习,适合零基础的有兴趣的人员入门,同时会一步步更深入学习,真正让你在学习工作中真正去用到所学。同时也会分享一些面试经验,助你找到高薪offer,让我们一起去学习,一起去进步,一起去涨薪!期待您的加入~~~关注回复“资料”可免费获取学习资料(含有电子书籍、视频等)。