zoukankan      html  css  js  c++  java
  • 简单介绍shell编程四剑客之grep

     

    概要:分别的作用

    grep:文本过滤(模式:pattern)工具,grep,egrep,fgrep,擅长过滤。

    sed:stream editor 文本编辑工具;(流编辑器),擅长取行、替换。

    awk:linux上的实现gawk,文件报告生成器;(独立的编程语言),过滤内容,擅长取列。

    find:linux上实时查找工具,通过便利指定路径下得文件系统完成文件查找。

    一、grep

        文本过滤(模式:pattern)工具,grep,egrep,fgrep

        文本搜索工具,根据用户指定的模式对目标文本逐行进行匹配检查,打印匹配到的行;

      1、模式

        由正则表达式字符及文本字所编写的过滤条件

        grep [OPTIONS] PATTERN[FILE]

      2、选项

        --color=auto:对匹配到的我那本着色显示;

        -v:显示不能够陪pattern匹配到的行;

        -i:忽略字符大小写;

        -o:仅显示匹配到的字符串;

        -q:静默模式,不输出任何信息;

        -A#:after,匹配到的后#行,就是显示匹配还显示该行之前得num行

        -B#:before,前#行,还显示该行之后得num行

        -C#context,前后各#行 ,还显示该行前后各num行

        -E:使用ERE;扩展正则表达式,egrep=grep -E

        -F:相当于fgrep

      3、正则表达式

        基于正则表达式元字符:

          1)、字符匹配:

            .: 匹配任意单个字符;
            []: 匹配指定范围内的任意单个字符
            [^]:匹配指定范围外的任意单个字符
            专用字符集合

              [:digit:]:任意数字,相当于0-9

              [:lower:]:所有的小写字符

              [:upper:]:大写字符

              [:alpha:]:大小写

              [:alnum:]:数字和字符

              [:punct:]:标点符号

              [:space:]:空格

              [:graph:] 可打印的非空白字符
            

            grep 's..n' /etc/passwd
            grep '...t' /etc/passwd
            grep'[[:alpha:]][[:alpha:]][[:alpha:]]t' /etc/passwd这样写太难受了,可以用匹配次数


          2)、匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数;
            *:匹配前面的字符任意次;仅表示次数

              nano grep.txt
                xxxxxxy
              grep "x*y" grep.txt,这就是贪婪模式,如果只有x是不可以的,x可以没有也可以出现多行

            贪婪模式
              .*:任意长度的任意字符;
                


              ?:匹配其前面的字符0或1次;即前面的可有可无;

                


              +:匹配其前面的字符至少1次;


              {m}:匹配前面的字符m次;
                


              {m,n}:匹配前面的字符至少m次,至多n次;


              {0,n}:匹配前面的字符至多n次;


              {m,}:匹配前面的字符至少m次;

        3)、位置锚定:
          ^:行首锚定;用于模式的最左侧;
          
          $:行尾锚定;用于模式的最右侧;
         
          ^PATTERN$: 用于模式匹配整行;


          ^$: 空行;
          ^[[:space:]]*$这个空白是可以没有的应为有*号

          < 或 :词首锚定;用于单词模式的左侧;单词的最左侧

          > 或 :词尾锚定;用于单词模式的右侧;

          <PATTERN>:匹配整个单词;

         分组:

          ():将一个或多个字符捆绑在一起,当作一个整体进行处理
            (xy)*ab
            nano grep.txt
            xyxyxyxy
            grep "(xy)+" 如果没有小括号,则代表x后面至少一个y


          Note: 分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: 1, 2, 3, ...
            1: 从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符;
            (ab+(xy)*):
            1: ab+(xy)*这个是和前面的有括号匹配
            2: xy
            当我们想后续内容与前面模式匹配到的语言,则需要使用引用,即后向引用
          后向引用:引用前面的分组括号中的模式所匹配字符,(而非模式本身)
            grep '[[:alpha:]]'{1,3}t>' /etc/passwd
            grep '[[:alpha:]]'{1,3}t>'.*'[[:alpha:]]'{1,3}t /etc/passwd 观察,有前后不一致的
            grep '[[:alpha:]]'{1,3}t>'.*1' /etc/passwd 现在观察匹配的相同的一定是一样的

         扩展正则表达式:

          基于正则表达式而言扩展正则表达式在某些参数上可以不使用转义符(),在使用方式上没有区别

            1)、字符匹配

              .

              []

              [^]

            2)、次数匹配

              * 

               ?:0或1次

              +:1次或多次

              {m}:匹配m次

              {m,n}:至少m至多n次

            3)、锚定

              ^

              $

              <,

              >,

              分组

              ()

              后向引用:1,2...

              或者 a|b

            

      4、实例

        实例1、显示/proc/meminfo文件中以大小s开头得行

     1 [root@web2 keepalived]# grep -i "^[Ss]" /proc/meminfo   
     2 SwapCached:            0 kB
     3 SwapTotal:       3933180 kB
     4 SwapFree:        3933180 kB
     5 Shmem:             92032 kB
     6 Slab:             131744 kB
     7 SReclaimable:      86092 kB
     8 SUnreclaim:        45652 kB
     9 [root@web2 keepalived]# grep -i "^s" /proc/meminfo    
    10 SwapCached:            0 kB
    11 SwapTotal:       3933180 kB
    12 SwapFree:        3933180 kB
    13 Shmem:             92032 kB
    14 Slab:             131752 kB
    15 SReclaimable:      86092 kB
    16 SUnreclaim:        45660 kB
    17 [root@web2 keepalived]# grep  "^[Ss]" /proc/meminfo  
    18 SwapCached:            0 kB
    19 SwapTotal:       3933180 kB
    20 SwapFree:        3933180 kB
    21 Shmem:             92032 kB
    22 Slab:             131752 kB
    23 SReclaimable:      86092 kB
    24 SUnreclaim:        45660 kB
    25 [root@web2 keepalived]# grep  "^s|^S" /proc/meminfo    
    26 SwapCached:            0 kB
    27 SwapTotal:       3933180 kB
    28 SwapFree:        3933180 kB
    29 Shmem:             92032 kB
    30 Slab:             131752 kB
    31 SReclaimable:      86092 kB
    32 SUnreclaim:        45660 kB
    33 [root@web2 keepalived]# 

        实例2、显示/etc/passwd文件中不以/bin/bash结尾行

     1 [root@web2 keepalived]# grep -v "/bin/bash"$ /etc/passwd
     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
     6 sync:x:5:0:sync:/sbin:/bin/sync
     7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8 halt:x:7:0:halt:/sbin:/sbin/halt
     9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10 operator:x:11:0:operator:/root:/sbin/nologin
    11 games:x:12:100:games:/usr/games:/sbin/nologin
    12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    13 nobody:x:99:99:Nobody:/:/sbin/nologin
    14 systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin
    15 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    16 dbus:x:81:81:System message bus:/:/sbin/nologin
    17 polkitd:x:998:997:User for polkitd:/:/sbin/nologin
    18 abrt:x:173:173::/etc/abrt:/sbin/nologin
    19 unbound:x:997:995:Unbound DNS resolver:/etc/unbound:/sbin/nologin
    20 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
    21 libstoragemgmt:x:996:994:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
    22 rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
    23 colord:x:995:993:User for colord:/var/lib/colord:/sbin/nologin
    24 usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
    25 saslauth:x:994:76:Saslauthd user:/run/saslauthd:/sbin/nologin
    26 geoclue:x:993:991:User for geoclue:/var/lib/geoclue:/sbin/nologin
    27 rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
    28 rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
    29 nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
    30 radvd:x:75:75:radvd user:/:/sbin/nologin
    31 qemu:x:107:107:qemu user:/:/sbin/nologin
    32 ntp:x:38:38::/etc/ntp:/sbin/nologin
    33 chrony:x:992:989::/var/lib/chrony:/sbin/nologin
    34 setroubleshoot:x:991:988::/var/lib/setroubleshoot:/sbin/nologin
    35 sssd:x:990:987:User for sssd:/:/sbin/nologin
    36 pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
    37 gdm:x:42:42::/var/lib/gdm:/sbin/nologin
    38 gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin
    39 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    40 avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
    41 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    42 tcpdump:x:72:72::/:/sbin/nologin
    43 nginx:x:988:983:Nginx web server:/var/lib/nginx:/sbin/nologin
    44 mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
    45 [root@web2 keepalived]# 

        实例3、显示/etc/passwd文件中ID号最大得用户的用户名

    1 [root@web1 keepalived]# sort -t: -k3 -n /etc/passwd |tail -1 |cut -d: -f1
    2 nfsnobody
    3 [root@web1 keepalived]# 

        实例4、如果用户root存在,显示其默认的shell程序

    1 [root@web1 keepalived]# id root &> /dev/null && grep "^root>" /etc/passwd | cut -d: -f7
    2 /bin/bash
    3 [root@web1 keepalived]# 

        实例5、找出/etc/passwd中的两位或三位数

     1 [root@web1 keepalived]# grep "<[0-9]{2,3}>" /etc/passwd
     2 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
     3 operator:x:11:0:operator:/root:/sbin/nologin
     4 games:x:12:100:games:/usr/games:/sbin/nologin
     5 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
     6 nobody:x:99:99:Nobody:/:/sbin/nologin
     7 systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin
     8 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
     9 dbus:x:81:81:System message bus:/:/sbin/nologin
    10 polkitd:x:998:997:User for polkitd:/:/sbin/nologin
    11 abrt:x:173:173::/etc/abrt:/sbin/nologin
    12 unbound:x:997:995:Unbound DNS resolver:/etc/unbound:/sbin/nologin
    13 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
    14 libstoragemgmt:x:996:994:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
    15 rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
    16 colord:x:995:993:User for colord:/var/lib/colord:/sbin/nologin
    17 usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
    18 saslauth:x:994:76:Saslauthd user:/run/saslauthd:/sbin/nologin
    19 geoclue:x:993:991:User for geoclue:/var/lib/geoclue:/sbin/nologin
    20 rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
    21 rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
    22 radvd:x:75:75:radvd user:/:/sbin/nologin
    23 qemu:x:107:107:qemu user:/:/sbin/nologin
    24 ntp:x:38:38::/etc/ntp:/sbin/nologin
    25 chrony:x:992:989::/var/lib/chrony:/sbin/nologin
    26 setroubleshoot:x:991:988::/var/lib/setroubleshoot:/sbin/nologin
    27 sssd:x:990:987:User for sssd:/:/sbin/nologin
    28 pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
    29 gdm:x:42:42::/var/lib/gdm:/sbin/nologin
    30 gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin
    31 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    32 avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
    33 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    34 tcpdump:x:72:72::/:/sbin/nologin
    35 zhangxingeng:x:1000:1000:centos-7-64:/home/zhangxingeng:/bin/bash
    36 nginx:x:988:983:Nginx web server:/var/lib/nginx:/sbin/nologin
    37 lightdm:x:987:982::/var/lib/lightdm:/sbin/nologin
    38 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
    39 redis:x:986:981:Redis Database Server:/var/lib/redis:/sbin/nologin
    40 mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
    41 [root@web1 keepalived]# 

        实例6、显示/etc/rc.d/rc.sysinit文件中,至少一个空白字符开头的且后面存非空白字符的行

     1 [root@web1 keepalived]# grep "^[[:space:]]+[[:graph:]]" /etc/grub2.cfg
     2   load_env
     3    set default="${next_entry}"
     4    set next_entry=
     5    save_env next_entry
     6    set boot_once=true
     7    set default="${saved_entry}"
     8   menuentry_id_option="--id"
     9   menuentry_id_option=""
    10   set saved_entry="${prev_saved_entry}"
    11   save_env saved_entry
    12   set prev_saved_entry=
    13   save_env prev_saved_entry
    14   set boot_once=true
    15   if [ -z "${boot_once}" ]; then
    16     saved_entry="${chosen}"
    17     save_env saved_entry
    18   fi
    19   if [ x$feature_all_video_module = xy ]; then
    20     insmod all_video
    21   else
    22     insmod efi_gop
    23     insmod efi_uga
    24     insmod ieee1275_fb
    25     insmod vbe
    26     insmod vga
    27     insmod video_bochs
    28     insmod video_cirrus
    29   fi
    30   set timeout_style=menu
    31   set timeout=5
    32   set timeout=5
    33   source ${prefix}/user.cfg
    34   if [ -n "${GRUB2_PASSWORD}" ]; then
    35     set superusers="root"
    36     export superusers
    37     password_pbkdf2 root ${GRUB2_PASSWORD}
    38   fi
    39         load_video
    40         set gfxpayload=keep
    41         insmod gzio
    42         insmod part_msdos
    43         insmod xfs
    44         set root='hd0,msdos1'
    45         if [ x$feature_platform_search_hint = xy ]; then
    46           search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  a9392b0d-ae01-41ce-b4a0-efb843235bfe
    47         else
    48           search --no-floppy --fs-uuid --set=root a9392b0d-ae01-41ce-b4a0-efb843235bfe
    49         fi
    50         linux16 /vmlinuz-3.10.0-514.el7.x86_64 root=UUID=11b66499-c82b-476f-8576-fc3690a4e26d ro crashkernel=auto rhgb quiet LANG=en_US.UTF-8
    51         initrd16 /initramfs-3.10.0-514.el7.x86_64.img
    52         load_video
    53         insmod gzio
    54         insmod part_msdos
    55         insmod xfs
    56         set root='hd0,msdos1'
    57         if [ x$feature_platform_search_hint = xy ]; then
    58           search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  a9392b0d-ae01-41ce-b4a0-efb843235bfe
    59         else
    60           search --no-floppy --fs-uuid --set=root a9392b0d-ae01-41ce-b4a0-efb843235bfe
    61         fi
    62         linux16 /vmlinuz-0-rescue-b7671beb75f14e95b5a58975dae3a897 root=UUID=11b66499-c82b-476f-8576-fc3690a4e26d ro crashkernel=auto rhgb quiet
    63         initrd16 /initramfs-0-rescue-b7671beb75f14e95b5a58975dae3a897.img
    64   source ${config_directory}/custom.cfg
    65   source $prefix/custom.cfg;
    66 [root@web1 keepalived]# 

        实例7、找出“netstat -tan”命令的结果以LISTEN后跟0、1或多个空白字符结尾

     1 [root@web1 keepalived]# netstat -tan | grep "LISTEN[[:space:]]*$"
     2 tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     
     3 tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     
     4 tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN     
     5 tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
     6 tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN     
     7 tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
     8 tcp6       0      0 :::111                  :::*                    LISTEN     
     9 tcp6       0      0 :::80                   :::*                    LISTEN     
    10 tcp6       0      0 :::22                   :::*                    LISTEN     
    11 tcp6       0      0 ::1:631                 :::*                    LISTEN     
    12 tcp6       0      0 ::1:25                  :::*                    LISTEN     
    13 [root@web1 keepalived]# 

        实例8、添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行;

     1 [root@web1 keepalived]# cat /etc/passwd | grep "(^[[:alnum:]]+>).*<1$" 
     2 [root@web1 keepalived]# useradd bash
     3 [root@web1 keepalived]# useradd testbash
     4 [root@web1 keepalived]# useradd basher
     5 [root@web1 keepalived]# useradd -s /sbin/nologin nologin
     6 [root@web1 keepalived]# grep "^([[:alnum:]]+>).*1$" /etc/passwd
     7 sync:x:5:0:sync:/sbin:/bin/sync
     8 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     9 halt:x:7:0:halt:/sbin:/sbin/halt
    10 bash:x:1001:1001::/home/bash:/bin/bash
    11 nologin:x:1004:1004::/home/nologin:/sbin/nologin
    12 [root@web1 keepalived]# 

        #谋定所有得数字和字符,至少出现一个所以用+,谋定整个单词词尾,然后()括号做分组,.*中间跟上任意内容,1$结尾跟括号内一致

      egrep实例

        实例9、显示当前系统root、centos或user1用户的默认shell和UID;

    1 [root@web1 keepalived]# grep -E '^(root|centos|user1)>' /etc/passwd | cut -d: -f 1,3,7
    2 root:0:/bin/bash
    3 [root@web1 keepalived]# 

        实例10、找出/etc/rc.d/init.d/functions文件中某单词后跟一个小括号的行

     1 [root@web1 keepalived]# grep -E -o "^[_[:alpha:]]+()" /etc/rc.d/init.d/functions
     2 checkpid()
     3 __kill_pids_term_kill_checkpids()
     4 __kill_pids_term_kill()
     5 __pids_var_run()
     6 __pids_pidof()
     7 daemon()
     8 killproc()
     9 pidfileofproc()
    10 pidofproc()
    11 status()
    12 echo_success()
    13 echo_failure()
    14 echo_passed()
    15 echo_warning()
    16 update_boot_stage()
    17 success()
    18 failure()
    19 passed()
    20 warning()
    21 action()
    22 strstr()
    23 is_ignored_file()
    24 is_true()
    25 is_false()
    26 apply_sysctl()
    27 [root@web1 keepalived]# 

          #_这个是连字符,+至少出现一次()显示()本身

        实例11、使用echo输出一绝对路径,使用egrep取出其基名

    1 [root@web1 keepalived]#  echo "/mnt/sdc" | grep -E -o "[^/]+/?$" | cut -d"/" -f1
    2 sdc
    3 [root@web1 keepalived]# 

        实例12、找出ifconfig命令结果中1-255之间的数值,这里分别表是0-9、10-99、100-199、200-249、250-255

    1 echo {1..1000} | egrep -o "[0-9]" | tr "
    " " " ;echo
    2 echo {1..1000} | egrep -o "[0-9]{2}" | tr "
    " " " ;echo
    3 echo {1..1000} | egrep -o "1[0-9]{2}" | tr "
    " " " ;echo
    4 echo {1..1000} | egrep -o "2[0-4][0-9]" | tr "
    " " " ;echo
    5 echo {1..1000} | egrep -o "25[0-5]" | tr "
    " " " ;echo 

        实例13、找出ifconfig命令结果中的IP地址

    1 [root@web1 keepalived]# ifconfig|egrep -o "<(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4]0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])>"
    2 255.255.255.0
    3 127.0.0.1
    4 255.0.0.0
    5 192.168.122.1
    6 255.255.255.0
    7 192.168.122.255
    8 [root@web1 keepalived]# 

    转载请注明出处:https://www.cnblogs.com/zhangxingeng/p/10789761.html 

  • 相关阅读:
    html pre 元素
    获取不重复随机数
    CSS查找匹配原理和简洁高效
    排序
    javascript 去数组重复项
    asp.net页面生命周期
    经典 Javascript 正则表达式
    深入理解JavaScript定时机制
    排序简介
    理解 JavaScript 闭包
  • 原文地址:https://www.cnblogs.com/zhangxingeng/p/10789761.html
Copyright © 2011-2022 走看看