linux三剑客精妙招式都汇总在本文了(建议收藏)

图片

关注上方浩道linux,回复资料,即可获取海量linuxPython网络通信等学习资料!

前言

大家好,这里是浩道linux,主要给大家分享linuxpython网络通信相关的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  HAODAOhaodao1:x:1000:1000::/home/haodao1:/bin/bashhaodao2:x:1002:1002::/home/haodao2:/bin/bashhaodao3:x:1003:1003::/home/haodao3:/bin/bash

2)找出文件haodao.txt中与haodao有关的内容,并且忽略大小写,加上行号显示,命令如下:

[root@haodaolinux1 ~]# grep -i -n "haodao" haodao.txt 6:HAODAO29:haodao1:x:1000:1000::/home/haodao1:/bin/bash35:haodao2:x:1002:1002::/home/haodao2:/bin/bash36: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 -n4: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/haodao28:dbus:x:81:81:System message bus:/:/sbin/haodao32: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 haodao3haodao4 haodao5 haodao6haodao7 haodao8 haodao9[root@haodaolinux1 ~]# awk '{print $1}' haotest02.txt  haodao1haodao4haodao7[root@haodaolinux1 ~]# awk '{print $2}' haotest02.txt  haodao2haodao5haodao8[root@haodaolinux1 ~]#

通过以上awk命令,针对动作{print $0}这里代表一整行输出,针对动作{print $1}代表第一列输出,针对动作{print $2}代表第二列输出

awk默认是以空格符为分隔符,不管有多少个空格,也会当成一个来处理。

awk是按行处理文件的,一行处理完毕后,再处理下一行,并且是根据用户指定的分隔符去处理,没有指定分隔符的,则默认以空格来当作分隔符。

1)针对haotest02.txt文件,输出第1列,第3列的内容,命令如下所示:

[root@haodaolinux1 ~]# awk '{print $1$3}' haotest02.txt  haodao1haodao3haodao4haodao6haodao7haodao9[root@haodaolinux1 ~]# awk '{print $1 $3}' haotest02.txt haodao1haodao3haodao4haodao6haodao7haodao9[root@haodaolinux1 ~]# awk '{print $1,$3}' haotest02.txt  haodao1 haodao3haodao4 haodao6haodao7 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 haodao6haodao7 haodao8 haodao9

4)针对haotest02.txt文件,输出第2行到第3行的内容,并且加上行号,命令如下所示:

[root@haodaolinux1 ~]# awk 'NR==2,NR==3{print NR,$0}' haotest02.txt 2 haodao4       haodao5 haodao63 haodao7       haodao8 haodao9[root@haodaolinux1 ~]#

5)针对haotest02.txt文件,输出第1列的内容,并且显示出字段数(总列数),命令如下所示:

[root@haodaolinux1 ~]# awk '{print $1,NF}' haotest02.txt      haodao1 3haodao4 3haodao7 3[root@haodaolinux1 ~]#

6)针对haotest02.txt文件,输出第1列和最后一列的内容,命令如下所示:

[root@haodaolinux1 ~]# awk '{print $1,$(NF)}' haotest02.txt   haodao1 haodao3haodao4 haodao6haodao7 haodao9[root@haodaolinux1 ~]#

3、自定义分隔符,进行文件格式化后输出。

准备一个haotest03.txt文件,内容如下所示:

图片

1)通过指定输入分隔符,如以:为输入分隔符,输出文件第一列的内容,命令如下所示:

[root@haodaolinux1 ~]# awk -F ":" '{print $1}' haotest03.txt rootbindaemonmailntptcpdumphaodao2haodao3[root@haodaolinux1 ~]#

或者通过修改系统默认输入分隔符变量(FS),进行输出,命令如下所示:

[root@haodaolinux1 ~]# awk -v FS=':' '{print $1}' haotest03.txt     rootbindaemonmailntptcpdumphaodao2haodao3[root@haodaolinux1 ~]#

2)通过修改默认输出分隔符变量(OFS),输出文件第一列和最后一列内容,并且两列之间就是通过输出分隔符隔开的,命令如下所示:

[root@haodaolinux1 ~]# awk -F ":" -v OFS='*****' '{print $1,$NF}' haotest03.txt root*****/bin/bashbin*****/sbin/nologindaemon*****/sbin/nologinmail*****/sbin/nologinntp*****/sbin/nologintcpdump*****/sbin/nologinhaodao2*****/bin/bashhaodao3*****/bin/bash[root@haodaolinux1 ~]#

结语

本文通过各种实例引出三剑客各自独有的武功招式,就类似给大家呈现了绝世剑谱。俗话说的好,勤能补拙。了解江湖的都知道,一个武林高手,即所得武功绝不是一日就可以达成。必须通过不断磨练,方能成就他日的非凡成就。所以针对以上三剑客的精华妙招,我们也要通过自己不断去敲命令,方能为自己所用,真正成为武林高手!

往期精彩内容回顾

shell脚本中的各种分支结构用法都在本文了(附带实例)

shell脚本中常见的运算符用法都在本文了(建议收藏)

总监给新员工开出了18K高薪,而不愿为6年工龄的我涨薪3K!

linux中如果不清楚2>&1怎么用,那说明你还不懂shell

更多精彩

关注公众号「浩道linux」

浩道linux,专注于linux系统的相关知识、网络通信、python相关知识以及涵盖IT行业相关技能的学习,适合零基础的有兴趣的人员入门,同时会一步步更深入学习,真正让你在学习工作中真正去用到所学。同时也会分享一些面试经验,助你找到高薪offer,让我们一起去学习,一起去进步,一起去涨薪!期待您的加入~~~关注回复“资料”可免费获取学习资料(含有电子书籍、视频等)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值