zoukankan      html  css  js  c++  java
  • 【Linux相识相知】文本处理工具之grepegrepfgrep及正则表达式

    常说Linux上有文本处理的三剑客,grep、sed和awk,本文就grep做出详细的描述,并引出正则表达式。

    grep

    NAME:打印模式匹配的行
    SYNOPISIS:
           grep [OPTIONS] PATTERN [FILE...]
           grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
    常用选项:
    --color=auto:对匹配到的文本着色后进行高亮显示,默认已被别名alias grep='grep --color=auto'
    -i:忽略字符的大小写
    -o:仅显示匹配到的字符串本身
    -v:显示不能被模式匹配到的行
    -E:支持使用扩展的正则表达式
    -q:静默模式,即不输出任何信息
    -A #:显示被模式匹配的行及其后#行
    -B #:显示被模式匹配的行及其前#行
    -C #:显示被模式匹配的行及其前后各#行

    举例1:匹配/etc/passwd下有frank的行

    [root@localhost tmp]# grep "frank" /etc/passwd
    frank:x:1000:1000:frank:/home/frank:/bin/bash

    举例2:匹配/etc/passwd下有frank的行,忽略大小写

    [root@localhost tmp]# grep -i "frank" /etc/passwd
    frank:x:1000:1000:frank:/home/frank:/bin/bash
    Frank:x:1001:1001::/home/Frank:/bin/bash

    举例3:匹配/etc/passwd下不能被bash匹配的行

    [root@localhost tmp]# grep -v "bash" /etc/passwd
    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
    ......
    pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
    gdm:x:42:42::/var/lib/gdm:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    tcpdump:x:72:72::/:/sbin/nologin

    举例4:仅仅匹配/etc/passwd下的frank,忽略大小写

    [root@localhost tmp]# grep -oi "frank" /etc/passwd
    frank
    frank
    frank
    Frank
    Frank

    举例5:静默模式匹配含有frank的行

    [root@localhost tmp]# grep -q "frank" /etc/passwd
    [root@localhost tmp]# 

    举例6:匹配/etc/passwd下含有ftp的行及其后3行

    [root@localhost tmp]# grep -A 3 "ftp" /etc/passwd
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

    举例7:匹配/etc/passwd下含有ftp的行及其前3行

    [root@localhost tmp]# grep -B 3 "ftp" /etc/passwd
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

    举例8:匹配/etc/passwd下含有ftp的行及其前后各2行

    [root@localhost tmp]# grep -C 2 "ftp" /etc/passwd
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin

    egrep

    支持扩展正则表达式实现类似于grep的文本过滤功能,相当于grep -E

    NAME:打印模式匹配的行
    SYNOPISIS:
            egrep [OPTIONS] PATTERN [FILE...]   
    -i:忽略字符的大小写
    -o:仅显示匹配到的字符串本身
    -v:显示不能被模式匹配到的行
    -q:静默模式,即不输出任何信息
    -A #:显示被模式匹配的行及其后#行
    -B #:显示被模式匹配的行及其前#行
    -C #:显示被模式匹配的行及其前后各#行
    -G:支持基本正则表达式

    fgrep

    fgrep搜索字符串而不是搜索匹配的表达式的模式,所以支持正则表达式,当无需要用到元字符去编写模式的时候,使用fgrep必能更好更快。

    支持-i,-v,-o,-A,-B,-C,-p等选项

    正则表达式

    Regular Expression,正则表达式,由一类特殊字符及文本字符编写的模式,其中有些不表示其字面的意义,而是用户控制或通配功能,分为基本正则表达式和扩展正则表达式。

    基本正则表达式元字符:

    字符匹配

    . :匹配任意单个字符;
    []:匹配指定范围内的任意单个字符;
          特殊匹配:[:digit:] 匹配任意单个数字
                            [:lower:] 匹配任意单个小写字母
                            [:upper:] 匹配任意单个大写字母
                            [:alpha:] 匹配任意单个字母
                            [:alnum:] 匹配任意单个字母或数字
                            [:punct:] 匹配任意单个符号
                            [:space:] 匹配单个空格
    [^]:匹配指定范围外的任意单个字符;

    匹配次数

    用在要指定其出现的次数的字符后面,用于限制其前面字符出现的次数,默认工作于贪婪模式

    *:匹配其前面的字符任意次数:0,1,多次
          .*:匹配任意长度的任意字符
    ?:匹配其前面的字符0次或者1次;
    +:匹配其前面的字符1次或者多次;
    {m}:匹配其前面的字符m次
    {m,n}:匹配其前面的字符至少m次,至多n次
            {m,}:至少m次

    位置锚定

    ^:托字符,行首锚定,用于模式的最左侧
    $:行尾锚定,用于模式的最右侧

    单词:非特殊字符组成的连续字符(字符串)都称为单词

    <或:词首锚定,用于单词模式的左侧
    >或:词尾锚定,用户单词模式的右侧
    <PATTERN>:匹配完整单词

    分组及引用

    分组:
    ():将一个或多个字符捆绑在一起,当做一个整体进行处理
    后向引用:引用前面的分组括号中的模式所匹配到的字符
    分组括号中的模式匹配到的内容或被正则表达式引擎自动记录于内部的变量中:
    1:模式从左侧起,第一个左括号及与之匹配的右括号之间模式匹配到的内容
    2:模式从左侧起,第二个左括号及与之匹配的右括号之间模式匹配到的内容
    以此类推

    举例:

    1.显示/etc/passwd文件中不以/bin/bash结尾的行

    [root@localhost tmp]# grep -v "/bin/bash$" /etc/passwd
    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
    ......
    gdm:x:42:42::/var/lib/gdm:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    tcpdump:x:72:72::/:/sbin/nologin

    2.找出/etc/passwd文件中的两位或三位数字

    [root@localhost tmp]# grep "<[[:digit:]]{2,3}>" /etc/passwd
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ......
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    tcpdump:x:72:72::/:/sbin/nologin

    3.找出etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行;

    [root@localhost tmp]# grep "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg 
      load_env
       set default="${next_entry}"
       set next_entry=
       save_env next_entry
       set boot_once=true
       set default="${saved_entry}"
      menuentry_id_option="--id"
      menuentry_id_option=""
      set saved_entry="${prev_saved_entry}"
      save_env saved_entry
      set prev_saved_entry=
      save_env prev_saved_entry
      set boot_once=true

    4.找出"netstat -tan"命令的结果中以LISTEN后跟0,1或多个空白结尾的行

    [root@localhost tmp]# netstat -tan | grep  "LISTEN[[:space:]]*$"
    tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
    tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN     
    tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
    tcp6       0      0 :::111                  :::*                    LISTEN     
    tcp6       0      0 :::22                   :::*                    LISTEN     
    tcp6       0      0 ::1:631                 :::*                    LISTEN     
    tcp6       0      0 ::1:25                  :::*                    LISTEN 

    扩展正则表达式元字符:

    字符匹配

    . :匹配任意单个字符;
    []:匹配指定范围内的任意单个字符;
          特殊匹配:[:digit:] 匹配任意单个数字
                   [:lower:] 匹配任意单个小写字母
                   [:upper:] 匹配任意单个大写字母
                   [:alpha:] 匹配任意单个字母
                   [:alnum:] 匹配任意单个字母或数字
                   [:punct:] 匹配任意单个符号
                   [:space:] 匹配单个空格
    [^]:匹配指定范围外的任意单个字符;

    匹配次数

    用在要指定其出现的次数的字符后面,用于限制其前面字符出现的次数,默认工作于贪婪模式。

    *:匹配其前面的字符任意次数:0,1,多次
       .*:匹配任意长度的任意字符
    ?:匹配其前面的字符0次或者1次;
    +:匹配其前面的字符1次或者多次;
    {m}:匹配其前面的字符m次
    {m,n}:匹配其前面的字符至少m次,至多n次
       {m,}:至少m次

    位置锚定

    ^:托字符,行首锚定,用于模式的最左侧
    $:行尾锚定,用于模式的最右侧

    单词:非特殊字符组成的连续字符(字符串)都称为单词

    <或:词首锚定,用于单词模式的左侧
    >或:词尾锚定,用户单词模式的右侧
    <PATTERN>:匹配完整单词

    分组及引用

    分组:
    ():将一个或多个字符捆绑在一起,当做一个整体进行处理
    后向引用:引用前面的分组括号中的模式所匹配到的字符
    分组括号中的模式匹配到的内容或被正则表达式引擎自动记录于内部的变量中:
    1:模式从左侧起,第一个左括号及与之匹配的右括号之间模式匹配到的内容
    2:模式从左侧起,第二个左括号及与之匹配的右括号之间模式匹配到的内容
    以此类推

    a|b:a或b
    C|cat:C或cat
    (C
    |c)at:cat或Cat

    小练习

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次

    who | grep -o  "^<[[:alpha:]]*" |  uniq
    View Code

    2、取出最后登录到当前系统的用户的相关信息

    id `who | tail -1 | grep -o  "^<[[:alpha:]]*"`
    View Code

    3.取出当前系统上被用户当做其默认shell的最多的那个shell

    cut -d: -f7 /etc/passwd | uniq -c | sort -n | tail -1 | cut -d' ' -f7
    View Code

    4.将/etc/passd中的第三个字段设置最大的后10个用户的信息全部给为大写保存至/tmp/maxuser.txt文件中

    [root@localhost ~]# sort -t: -k3 -n /etc/passwd | tail -10 | tr 'a-z' 'A-Z'  &>  /tmp/maxuser.txt
    View Code

    5.取出当前主机的IP地址

    ifconfig | grep -Eo "([1-9]|[1-9][1-9]|1[0-9][0-9]|2[0-5][0-4]).([0-9]|[1-9][1-9]|1[0-9][0-9]|2[0-5][0-5]).([0-9]|[1-9][1-9]|1[0-9][0-9]|2[0-5][0-5]).([1-9]|[1-9][1-9]|1[0-9][0-9]|2[0-5][0-4])[[:space:]]" |grep -v "127.0.0.1"
    
    或者
    ifconfig | grep "[[:space:]*]<inet>" |  cut -d' ' -f10 | grep -v "127.0.0.1"
    View Code

    6.列出/etc目录下所有已.conf结尾的文件的文件名,并将其名字转换为大写后保存至/tmp/etc.conf文件中

    find  /etc  -name  "*.conf" | egrep -o "[^/][^/]*$" | tr 'a-z' 'A-Z' > /tmp/etc.test
    View Code

    7.显示/var目录下一级子目录或文件的总数

    ls /etc/ | wc -l
    View Code

    8.取出/etc/group第三个字段数值最小的10个组的名字

    sort -t: -k3 -n /etc/group | head -10 | cut -d: -f1
    View Code

    9.将/etc/fstab和/etc/issue文件的内容合并为同一个内容后保存至/tmp/etc.test文件中

    cat /etc/issue  /etc/fstab | tee /tmp/etc.test  &> /dev/null
    View Code

    10.显示/proc/meminfo文件中以大写或者小写S开头的行,用两种方式

    [root@localhost home]# egrep "^[sS]" /proc/meminfo
    [root@localhost home]# egrep  -i "^s" /proc/meminfo 
    View Code

    11.显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户

    [root@localhost home]# grep -v "/sbin/nologin"  /etc/passwd
    View Code

    12.显示/etc/passwd文件中其默认shell为/bin/bash的用户

    [root@localhost home]# grep  "/bin/bash"  /etc/passwd
    View Code

    13.找出/etc/passwd文件中的一位或两位数

    [root@localhost /]# egrep "<[[:digit:]]{1,2}>"  /etc/passwd
    View Code

    14.显示/boot/grub2/grup.cfg中至少一个空白字符开头的行

    [root@localhost /]# egrep "^[[:space:]]+[^[:space:]]"  /boot/grub2/grub.cfg 
    View Code

    15.显示/etc/rc.d/rc.local文件中以#开头,后面跟至少一个空白字符,而后又至少一个非空白字符的行

    [root@localhost /]# egrep  "^#[[:space:]]+[^[:space:]]"   /etc/rc.d/rc.local 
    # THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
    # It is highly advisable to create own systemd services or udev rules
    # to run scripts during boot instead of using this file.
    # In contrast to previous versions due to parallel execution during boot
    # this script will NOT be run after all other services.
    # Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
    # that this script will be executed during boot.
    View Code

    16.打出netstat -tan命令执行结果以'LISTEN'后跟空白字符结尾的行

    [root@localhost /]# netstat -tan | egrep "LISTEN[[:space:]]+"
    tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
    tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN     
    tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
    tcp6       0      0 :::111                  :::*                    LISTEN     
    tcp6       0      0 :::22                   :::*                    LISTEN     
    tcp6       0      0 ::1:631                 :::*                    LISTEN     
    tcp6       0      0 ::1:25                  :::*                    LISTEN 
    View Code

    17.添加用户bash,testbash,basher,nologin(此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息

    [root@localhost /]# useradd bash
    [root@localhost /]# useradd testbash
    [root@localhost /]# useradd basher
    [root@localhost /]# useradd -s /sbin/nologin nologin
    [root@localhost /]# egrep  "^(<[a-z]+>).*1$"   /etc/passwd
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    bash:x:2004:2004::/home/bash:/bin/bash
    nologin:x:2007:2007::/home/nologin:/sbin/nologin
    View Code
  • 相关阅读:
    致歉
    博客园上海俱乐部活动报道
    博客园手机版
    味道不错的NBearLite查询语法
    关于面向对象的讨论
    变形金刚皮肤
    准备在北京Tech·Ed上组织博客园聚会
    SVN&.NET
    博客园手机版功能更新
    最省时管理法:让你一天随意
  • 原文地址:https://www.cnblogs.com/liubinsh/p/7225097.html
Copyright © 2011-2022 走看看