(转)linux正则表达式详解

linux正则表达式详解

http://blog.csdn.net/wuliowen/article/details/64131815

1:什么是正则表达式:

简单的说,正则表达式就是处理字符串的方法,它是以行为单位进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易达到查找,删除,替换某特定字符串的处理程序。

2:一些参数:
grep [-A] [-B] [--color=auto] '收索字符串' filename

-A :后面可加数字,为after的意思,除了列出该行以外,后续的n行也被列出来。
-B :后面可加数字,为befer的意思,除了列出该行以外,前面的n行也被列出来。
--color=auto:可将正确的那个选取数据列出颜色
范例一:
dmesg | grep 'eth'
#dmesg 可以列出内核的信息,通过grep选取网卡相关信息。
范例二:
dmesg | grep -n --color-auto 'eth'
[root@Slave0 hadoop]# dmesg | grep -n --color=auto 'eth'
452:[   11.213498] 8021q: adding VLAN 0 to HW filter on deviceeth0
发现除了eth会有特殊的颜色,且加上行号显示。
范例三:
dmesg | grep -n -A3  -B2 --color=auto 'eth'
450-[   11.213478] 802.1Q VLAN Support v1.8 Ben Greear <greearb@candelatech.com>
451-[   11.213482] All bugs added by David S. Miller <davem@redhat.com>
452:[   11.213498] 8021q: adding VLAN 0 to HW filter on deviceeth0
453-[   11.334391] cnic: Broadcom NetXtreme II CNIC Driver cnic v2.5.20 (March 14, 2014)
454-[   11.355742] bnx2fc: Broadcom NetXtreme II FCoE Driver bnx2fc v2.4.2 (Dec 11, 2013)
455-[   11.371077] netlink: 12 bytes leftover after parsing attributes.
发现除了eth会有特殊的颜色,且加上行号显示。且452的前两行,452的后三行也显示出来了。

三:基础正则表达式练习:

例1:查找特定字符串

[root@Master ~]# grep -n 'ab' newusers
5:Annabell:Cho:90:1
8:Rebecca:Fabry:60:1
[root@Master ~]# 
如果反向选择呢?也即是说该行没有‘ab’这个字符串才会显示在屏幕上
[root@Master ~]# grep -vn 'ab' newusers
1:Betsey:Werts:60:1
2:Henriette:Balla:30:1
3:Julieann:Hopps:30:2
4:Conrad:Menz:60:1
6:Allyn:Kenley:60:1

例2:利用中括号[]来查找集合字符。

如果我想找testhe taste这两个单词,可以发现,他们共同有‘t?st’存在,这个时候,我们可以这样查找。
grep -n 't[ae]st' newusers
如果查找到有dd字符时,则使用:
grep -n 'dd' newusers
如果不想要dd前面有g,此时可以可用集合字符的反向选择[^]来完成。
grep -n '[^g]dd' newusers

例3:行首和行尾字符^$

如果想要字符串‘the’只在行首才列出,之格式化就要用到制表符了,做法如下:
grep -n '^the' filename
如果要列出字母开头
grep -n '^[a-z]' filename
如果不想要开头是字母的
grep -n '^[^a-zA-Z]' filename
注:那个^符号在字符集合符号(中括号[])之内与之外是不一样的,在【】代表“反向选择”,在【】之外则代表定外在行首的意义。
那么如果要找出行位结束为小数点(.)的那一行,该怎么处理呢?
 grep -n '\.$' filename
特别注意,小数点具有其他意义,所以必须使用转义字符(\)加以解除他的特殊意义。
如果要找出空白行:
grep -n '^$' filename
例4:任意一个字符.与重复字符*
.(小数点):代表一定有一个任意字符的意思
grep -n 'g..d' filename
[root@Master ~]# grep -n a..a newusers
2:Henriette:Balla:30:1
21:Elsa:Casazza:60:3
*(星号):代表重复前一个0到无穷多次的意思,为组合形态。
grep -n 'ooo*' filename
注,前两个o肯定要必须存在,第三个o则是可有可无的多个o

四:基础正则表达式字符:

RE字符 意义和范例
^word 查找(word)在行首
word$ 查找(word)在行尾
. 代表一定有一个任意的字符
\ 将特殊符号的特殊意义去除
* 重复零个到无穷多个的前一个字符
[list] 从字符集合的RE字符里面找出想要选取的字符
[n1-n2] 从字符集合的RE字符里面找出想要选取的字符范围.如:grep -n '[0-9]' filename
[^list] 从字符集合的RE字符里面找出不要的字符串范围。
\{n,m\} 连续n到m个前一个RE字符,若为\{n\}则是连续n个的前一个RE字符,若为\{n,\}则是连续
n个以上的前一个RE字符,
范例:在g与g之间有2到3个o存在的字符串即(goog)(gooog)
grep -n 'go\{2,3\}g' filename

原文:http://www.moozsec.com/post-31.html

grep命令的扩展正则表达式可用egrep表示,也可以用grep -E来表示;

egrep:        

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

    用法:
        egrep [OPTIONS] PATTERN [FILE...]
            OPTIONS:
                -i:ignorecase,忽略字符的大小写;
                -o:仅显示匹配到的字符串本身;
                -v, --invert-match:反向显示,显示不能被模式匹配到的行;
                -E:支持使用扩展的正则表达式元字符;
                -q, --quiet, --silent:静默模式,即不输出任何信息;
                -A #:after,显示匹配到的字符串后#行
                -B #:before,显示匹配到的字符串前#行
                -C #:依次类推;
                -G:支持基本正则表达式;

扩展正则表达式的元字符:
    字符匹配:
        .:匹配任意单个字符;
        []:匹配指定范围内的任意单个字符;
        [^]:匹配指定范围外的任意单个字符;
            [:digit:]、[:lower:]、[:upper:]、[:alnum:]、[:alpha:]、[:space:]、[:punct:]
    次数匹配
        *:匹配其前面的字符任意次:0,1,多次;
        .*:匹配任意长度的任意字符;    
        ?:匹配其前面的字符0次或1次,即其前面的字符是可有可无的;
        +:匹配其前面的字符1此或多次;即其前面的字符要至少出现一次;
        {m}:匹配其前面字符m次;
        {m,n}:匹配其前面的字符至少m次,至多n次;
            {0,n}:至多n次;
            {m,}:至少m次;
    位置锚定
        ^:行首锚定;用于模式的最左侧;
        $:行尾锚定;用于模式的最右侧;
        ^PATTERN$:用于PATTERN来匹配整行;
            ^$:空白行;
            ^[[:space:]]*$:空行或包含空白字符的行;

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

            \<或\b:词首锚定,用于单词模式的左侧;
            \>或\b:词尾锚定,用于单词模式的右侧;
            \<PATTERN\>:匹配完整单词;
    分组及引用
        ():将一个或多个字符捆绑在一起,当作一个整体进行处理;
        如:(xy)*ab

    Note:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量为:
        后向引用:\1,\2,...
    或
        a|b:a或者b;
            如:C|cat的意思是C或cat
                (c|C)at:cat或Cat;
示例:
    1、找出/etc/passwd文件中两位数或三位数;
            ~]# grep -E "\<[[:digit:]]{2,3}\>" /etc/passwd

    2、找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面存在非空白字符的行;
        ~]# grep -E "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg

    3、找出/proc/meminfo文件中,所有以大写或小写S开头的行;至少有两种实现方式;
        ~]# grep -i "^s" /proc/meminfo 
        ~]# grep -E "(s|S)" /proc/meminfo
        ~]# grep "^[sS]" /proc/meminfo

    4、显示当前系统上root、centos或user1用户的相关信息;
        ]# grep -E "^(root|centos|user1)\>"    /etc/passwd

    5、找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行;
        ~]# grep -Eo "^[_[:alnum:]]+\(\)" /etc/rc.d/init.d/functions

    6、使用echo命令输出一个绝对路径,使用egrep取出其基名;
        ~]# echo /etc/rc.d/init.d/functions | grep -Eo "[^/]+/?$"
            进一步:取出其路径名;类似于对齐执行dirname命令的结果;
                ~]# echo /etc/rc.d/init.d/functions | grep -Eo "^/.*/"

    7、找出ifconfig命令结果中1-255之间的数值;
        ~]# ifconfig | grep -Eo "\<[1-9]|[1-9][0-9]|1([0-9]{2})|2[0-4][0-9]|25[0-5]\>"

    8、找出ifconfig命令结果中的IP地址;
        ~]# ifconfig | grep -Eo "\<(([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])"

    9、添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行;
        ~]# useradd  bash
        ~]# useradd  testbash
        ~]# useradd  basher
        ~]# useradd -s /sbin/nologin nologin
        ~]# grep -E "^([^:]+\>).*\1$" /etc/passwd

fgrep:不支持正则表达式元字符;
当无需用到元字符去编写模式时,使用fgrep性能更好;代码数量越多使用显示性能效果更为明显; 

文本查看及处理工具:wc,cut,sort,uniq,diff,patch

wc:word count
    功能:
        print newline, word, and byte counts for each file
        打印文件的行、字、字节数;
        wc [OPTION]... [FILE]...
        OPTIONS:
            -l:lines 仅打印行
            -w:words 仅打印字
            -c:bytes 仅打印字节

cut:remove sections from each line of files
        删除文件的某一行的某一部分;
    cut OPTION... [FILE]...
        OPTIONS:
            -d CHAR:以指定字符为分隔符;
            -f FILES:挑选出的字段;
                #:指定的单个字段;
                #-#:连续的多个字段;
                #,#:离散的多个字段;

sort:sort lines of text files
        对文本文件的行进行排序;
    sort [OPTION]... [FILE]...
        -t CHAR:指定分隔符;
        -k #:用于排序指定
        -n:基于数值大小而非字符进行排序;
        -r:逆序排序;
        -f:忽略字符大小写;
        -u:重复的行只保留一份;
            重复行:连续且相同;

uniq:report or omit repeated lines 
        报告或移除重复的行;
    uniq [OPTION]... [INPUT [OUTPUT]]
        -c:显示每行的重复次数
        -u:仅显示未曾重复的行;
        -d:仅显示重复的行;

diff:compare files line by line
        逐行比较两个文件不同之处;
    diff [OPTION]... FILES

    diff /PATH/TO/OLDFILE /PATH/TO/NEWFILE>/PATH/TO/PATCH_FILE
        -u:使用unfied机制,即显示要修改的行的上下文,默认为3行;

patch:向文件打补丁;
    patch [OPTIONS] -i /PATH/TO/PATCH_FILE /PATH/TO/OLDFILE

    patch /PATH/TO/OLDFILE < /PATH/TO/PATCH_FILE

示例:取出ifconfig eno16777736命令中的ip地址;
    ~]# ifconfig eno16777736 | head -2 | tail -1 | tr -s " " | cut -d " " -f3
posted @ 2018-01-16 22:07  liujiacai  阅读(570)  评论(0编辑  收藏  举报