• grep与正则表达式使用


    grep简介

    grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。通常grep有三种版本grep、egrep(等同于grep -E)和fgrep。egrep为扩展的grep,fgrep则为快速grep(固定的字符串来对文本进行搜索,不支持正则表达式的引用但是查询极为快速)。grep是Linux文本处理三剑客之一。

    grep使用方式

     常用选项:  –color=auto:对匹配到的文本着色后进行高亮显示;
    -c:只输出匹配的行数 
    -i:匹配时忽略大小写
    -h:多文件匹配时不显示文件名,默认显示、
    -l:只列出符合匹配的文件名,而不显示匹配的行内容
    -n:显示行号、
    -s:不显示错误消息
    -q:禁止输出任何结果,以退出状态表示搜索是否成功 $? 查看,值0或者1
    -v:取反,显示不包含匹配文件本的所有行
    -o:只显示被匹配到的字符串
    -C n:显示匹配字符前后面的行数
    -A n:显示匹配字符后面的行数
    -B n:显示匹配字符前面的行数 n:数值
    -e : 实现多个参数之间的 ‘或’ 的关系 eg: grep -e root -e bash /ect/passwd
    -w : 匹配单词

    注:使用grep匹配时需使用双引号引起来(单引号为强引用),防止被系统误认为参数或者特殊命令而报错。

    扩展grep使用方式

    使用方式:egrep [OPTIONS] PATTERN [FILE…]

    或 grep -E [OPTIONS] PATTERN [FILE…]

    扩展正则表达式在基本正则表达式上进行了修改,主要取消反斜线转移,更容易看

    字符匹配:

    .: 任意单个字符
    []: 指定范围内的任意单个字符
    [^]: 指定范围外的任意单个字符

    次数匹配:

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

    锚定:

    ^: 行首
    $: 行尾
    <, : 词首
    >, :词尾

    分组:

    (): 分组
    |: 或者, ac|bc
    grep -E "con(C|c)at" 匹配conCat或concat
                    

    grep基本正则表达式元字符

    匹配次数

      *:前一个字符出现任意次数,包括0次
    .* :任意字符出现任意次数
    ?:前一个字符出现1次或者0次
    +:出现1次或者1次以上
    {n}:精确匹配次数
    {m,n}:匹配m到n次之间
    {n,} :匹配最少n次以上
    {,n} :匹配最多n次以上
    [a-z]+ : 任意一个字符至少出现一次 ;
    . 在[]中没有任何意义,就是点本身

    位置锚定

    ^ : 匹配行首
    $ ; 匹配行尾
    ^$: 匹配空白行
    [^]:取反匹配

    分组

        (匹配内容) :匹配括号内的内容
    (数字) :重复前面匹配的内容再匹配
    eg:匹配开头行和结尾行一样的行
    [root@yufu ~]# grep "^(.*):.*/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

    后向引用:引用前面的分组括号中的模式所匹配到的字符 分组括号中的模式匹配到的内容或被正则表达式引擎自动记录于内部的变量中: 1:模式从左侧起,第一个左括号及与之匹配的右括号之间模式匹配到的内容 2:模式从左侧起,第二个左括号及与之匹配的右括号之间模式匹配到的内容…

    扩展正则表达式与正则表达式略有不同:
    ‘[]’:依旧匹配指定范围内的任意单个字符;但是有很多特殊匹配方式。
    [:digit:] 匹配任意单个数字
    [:lower:] 匹配任意单个小写字母
    [:upper:] 匹配任意单个大写字母
    [:alpha:] 匹配任意单个字母
    [:alnum:] 匹配任意单个字母或数字
    [:punct:] 匹配任意单个符号
    [:space:] 匹配单个空格
    一些地方取消了转义字符的使用:
    ‘?‘:匹配其前面的字符0次或者1次;
    ‘+’:匹配其前面的字符1次或者多次;
    ‘{m}‘:匹配其前面的字符m次(为转义字符)
    ‘{m,n}’:匹配其前面的字符至少m次,至多n次
    ():将一个或多个字符捆绑在一起,当做一个整体进行处理,反向引用照常使用。
    |’:或(注:‘C|cat’为C与cat,‘(C|c)at才是Cat与cat’)

    一些例子

    1.显示/proc/meminfo文件中以大小写s开头的行
    [root@localhost ~]#cat /proc/meminfo | grep -io "^[s].*"
    SwapCached: 0 kB
    SwapTotal: 2097148 kB
    SwapFree: 2097148 kB
    Shmem: 6900 kB
    Slab: 36828 kB
    SReclaimable: 18184 kB
    SUnreclaim: 18644 kB
    2.取出默认shell为非bash的用户
    [root@localhost ~]#cat /etc/passwd | grep -v "[bash]$" | cut -d : -f 1
    bin
    daemon
    adm
    lp
    sync
    shutdown
    halt
    mail
    operator
    games
    ...省略...
    3.取出默认shell为bash的且其ID号最大的用户
    [root@localhost ~]#cat /etc/passwd | grep "bash$" | cut -d: -f 3 | sort -nr | head -1
    1003
    4.显示/boot/grub/grub.conf中以至少一个空白字符开头的行
    [root@yufu ~]# cat /boot/grub/grub.conf | grep "^[[:space:]]+"
    root (hd0,0)
    kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=96cb6b8f-c3da-41d1-a063-cfd0e8177085 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
    initrd /initramfs-2.6.32-696.el6.x86_64.img
    5.找出/etc/passwd文件中一位数或两位数
    [root@yufu ~]# cat /etc/passwd | grep -o "<[0-9][0-9]>"
    12
    10
    14
    11
    12
    13
    30
    14
    50
    99
    99
    81
    81
    69
    ...省略...
    6.找出ifconfig命令结果中所有ip地址
    [root@yufu ~]# ifconfig | grep -o "[0-9.]{7,}"
    192.168.214.187
    192.168.214.255
    255.255.255.0
    127.0.0.1
    255.0.0.0
    7.添加用户bash和testbash、basher,而后找出当前系统上其用户名和默认shell相同的用户
    [root@yufu ~]# cat /etc/passwd | grep -E "^<([[:alpha:]]{1,})>:.*1$"
    或者:[root@yufu ~]# cat /etc/passwd | grep -E "^<([a-zA-Z]{1,})>:.*1$"
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    8.统计/etc/rc.d/rc.sysinit文件中以#开头的行的行数,以及空白行的行数
    #开头的行
    [root@yufu ~]# grep "^#.*" /etc/rc.d/rc.sysinit | wc -l
    44
    #空行
    [root@yufu ~]# grep "^$" /etc/rc.d/rc.sysinit | wc -l
    100
    9.利用df和grep,取出磁盘各分区利用率,并从大到小排序
    [root@yufu ~]# df -h | grep "^/dev" | grep -o "[0-9]+%" | grep -o "[0-9]+" | sort -nr 
    29
    21
    1
  • 相关阅读:
    Java——通过Java代码启动批处理文件
    成功解决错误1130 Host xxx is not allowed to connect to this MySQL server
    SQL全文索引的作用(转)
    查找不重复记录
    全文索引原理和一个完整的SQL SERVER数据库全文索引的示例(转)
    C# 参考:令人惊喜的泛型委托 Predicate/Func/Action
    moss 外网访问设置
    SQL2000和SQL2005的行转列处理方法
    海量数据库查询
    MSSQL 查询优化二(转)
  • 原文地址:https://www.cnblogs.com/anay/p/8971187.html
Copyright © 2020-2023  润新知