暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

小雨青年 2022-01-11
305
关注上方浩道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  
        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/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/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行的数据,命令如下所示:

                                [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
                                                                mail
                                                                ntp
                                                                tcpdump
                                                                haodao2
                                                                haodao3
                                                                [root@haodaolinux1 ~]#

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

                                                                  [root@haodaolinux1 ~]# awk -v FS=':' '{print $1}' haotest03.txt     
                                                                  root
                                                                  bin
                                                                  daemon
                                                                  mail
                                                                  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 ~]#


                                                                    结语

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



                                                                    往期精彩内容回顾

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

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

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

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

                                                                    更多精彩

                                                                    关注公众号「浩道linux」

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


                                                                    喜欢的话,记得点“赞”“在看”



                                                                    文章转载自小雨青年,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                                    评论