grepegrep命令及正则表达式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了grepegrep命令及正则表达式相关的知识,希望对你有一定的参考价值。
grep系:
grep:Global search Regular Expression and Print out the line。
利用正则表达式进行全局搜索并将匹配到的行显示出来;
格式:
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
PATTERN:过滤匹配条件,是由没有特殊意义的文本字符或者是正则表达式元字符构成;
grep: 仅支持基本正则表达式元字符
egrep:可以支持扩展正则表达式元字符
fgrep:不支持任何形式的正则表达式元字符,将所有的字符都视为没有特殊意义的普通文本字符;
其中正则表达式与扩展正则表达式主要区别在于,正则表达式有的需要将反斜线写出来,而扩展正则表达式则不需要。
正则表达式的元字符:
基本的正则表达式元字符:BRE
字符匹配类:
".":匹配任意的单个字符;
[[email protected] ~]# grep "a.b" a.txt aaaaaabbbabcabccccc abcabcabcbcacbaaaaa
(匹配a和b中间跟上任意字符的行,结果分别为abc,以及acb)
"[]":匹配任意指定范围内的单个字符;
[[email protected] ~]# grep "[a]" a.txt aaaaaabbbabcabccccc abcabcabcbcacbaaaaa
(匹配只有a的行)
[^]:匹配任意指定范围以外的单个字符;
[[email protected] ~]# grep "[^abc]" a.txt ddddddddddddddddddk ccccccccccccccccccl
(匹配除了字母abc以外的字符存在的行,结果是d,k以及l)
下列所有的字符集都可以放置于[]之中,用于匹配字符集范围内的单个字符;
1、[:lower:]:所有的小写字母
[[email protected] ~]# grep "[[:lower:]]" a.txt aaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbb
(匹配所有小写字母存在的行)
2、[:upper:]:所有的大写字母
[[email protected] ~]# grep "[[:upper:]]" a.txt DDDDDDDDDDDDDCCCCCC AAACACABCAAABCAAAAA
(匹配所有大写字母存在的行)
3、[:alpha:]:所有字母,大小写字母;
[[email protected] ~]# grep "[[:alpha:]]" a.txt DDDDDDDDDDDDDCCCCCC AAACACABCAAABCAAAAA aaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbb
(匹配所有大小字母存在的行)
4、[:digit:]:所有单个的十进制数字;
[[email protected] ~]# grep "[[:digit:]]" a.txt ccccccccccccccc2222
(匹配单个十进制数字存在的行)
5、[:alnum:]:所有的字母和十进制数字;
[[email protected] ~]# grep "[[:alnum:]]" a.txt DDDDDDDDDDDDDCCCCCC AAACACABCAAABCAAAAA aaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbb ccccccccccccccc2222
(匹配所有的字母和十进制数字)
6、[:punct:]:所有的符号
[[email protected] ~]# grep "[[:punct:]]" a.txt $######@@@#$$$##@@# &*(^())(_(&%[email protected]#$$^*
(匹配所有符号存在的行)
7、[:space:]:表示空白字符,包括空格和制表符;
[[email protected] ~]# grep "[[:space:]]" a.txt |wc -l 3
(匹配空白字符存在的行,在此文件中有三行)
8、[a-z]:只表示所有的小写字母;
[[email protected] ~]# grep "[a-z]" a.txt aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbb ccccccccccccccc2222
(匹配所有小写字母存在的行)
9、[A-Z]:只表示所有的大写字母;
[[email protected] ~]# grep "[A-Z]" a.txt DDDDDDDDDDDDDCCCCC AAACACABCAAABCAAAAA
(匹配所有大写字母存在的行)
10、[0-9]:仅表示所有的十进制数码;
[[email protected] ~]# grep "[0-9]" a.txt ccccccccccccccc2222
(匹配所有小写字母存在的行)
次数匹配类:该类字符前面的一个字符可以出现的次数;
1、*:其前面的字符可以出现任意次,即:0次,1次或多次;
[[email protected] ~]# grep "AAA*" a.txt AAACACABCAAABCAAAAA
(匹配有AAA的行)
2、\?:其前面的字符可有可无,即:0次或1次;
[[email protected] ~]# echo /etc/passwd | grep -o "[^/]*/\?$" passwd
(输出某个路径的基名)
3、\{m,n\}:其前面的字符至少出现m次,最多不超过n次;
[[email protected] ~]# grep "A\{2,5\}" a.txt AAACACABCAAABCAAAAA
(匹配打A的行中,A至少出现2次,不能超过5次)
4、\{m\}:其前面的字符必须出现m次;
[[email protected] ~]# grep "A\{5\}" a.txt AAACACABCAAABCAAAAA
(匹配打的A在本行中必须出现5次,匹配结果是最后的AAAAA)
5、\{m,\}:其前面的字符至少出现m次;
[[email protected] ~]# grep "A\{1,\}" a.txt AAACACABCAAABCAAAAA
(匹配到的A至少出现1次,即结果中的A全部匹配到)
6、\{,n\}:其前面的字符至少出现0次,最多不超过n次;
[[email protected] ~]# grep "a\{,1\}" b.txt aabaaabacccvv ababababababa cccccccccccca
(匹配到的a至少出现0次,最多不超过1
次)
7、注意:在正则表达式中,表示任意长度的任意字符:".*"
[[email protected] ~]# grep "^[[:space:]].*" /etc/grub2.cfg
(找出/etc/grub2.cfg以空白字符开头的非空白行;)
位置锚定字符:
行锚定:
行首锚定:^
行尾锚定:$
[[email protected] ~]# grep "^[[:space:]]*$" /etc/grub2.cfg | wc -l 17
空白行数
字锚定
字首锚定:\<或\b
字尾锚定:\>或\b
[[email protected] ~]# ifconfig | grep "\<[0-9]\>\|\<[1-9][0-9]\>"
找出一位数或者两位数
分组与前向引用字符:
\(\):将()中包含的内容作为一个不可分割的整体来处理;
\1,\2,\3...:前向引用字符,
是正则表达式处理引擎的内置变量,\1表示前面所出现的第一组小括号中所阔扩选的内容;\2表示前面所出现的第二组小括号中扩选的内容;...
\(string1\(string2\)\): \1表示string1,\2表示string2
\(string1\).*\(string2\): \1表示string1,\2表示string2
[[email protected] ~]# grep "^\(root\).*\1" /etc/passwd root:x:0:0:root:/root:/bin/bash
或者:
\|:将其左右的字符或字符串当做整体来对待;
"C\|cat" C cat
[[email protected] ~]# ifconfig | grep "\<[0-9]\>\|\<[1-9][0-9]\>"
(找出ifconfig中一位数或者两位数)
扩展的正则表达式元字符:ERE
字符匹配类:
1、".":匹配任意的单个字符;
[[email protected] ~]# egrep "a.b" a.txt aaaaaabbbabcabccccc abcabcabcbcacbaaaaa
(匹配a和b中间跟上任意字符的行,结果分别为abc,以及acb)
2、 "[]":匹配任意指定范围内的单个字符;
[[email protected] ~]# egrep "[a]" a.txt aaaaaabbbabcabccccc abcabcabcbcacbaaaaa
(匹配只有a的行)
3、[^]:匹配任意指定范围以外的单个字符;
[[email protected] ~]# egrep "[^abc]" a.txt ddddddddddddddddddk ccccccccccccccccccl
(匹配除了字母abc以外的字符存在的行,结果是d,k以及l)
下列所有的字符集都可以放置于[]之中,用于匹配字符集范围内的单个字符;
1、[:lower:]:所有的小写字母
[[email protected] ~]# egrep "[[:lower:]]" a.txt aaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbb
(匹配所有小写字母存在的行)
2、[:upper:]:所有的大写字母
[[email protected] ~]# egrep "[[:upper:]]" a.txt DDDDDDDDDDDDDCCCCCC AAACACABCAAABCAAAAA
(匹配所有大写字母存在的行)
3、[:alpha:]:所有字母,大小写字母;
[[email protected] ~]# egrep "[[:alpha:]]" a.txt DDDDDDDDDDDDDCCCCCC AAACACABCAAABCAAAAA aaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbb
(匹配所有大小字母存在的行)
4、[:digit:]:所有单个的十进制数字;
[[email protected] ~]# egrep "[[:digit:]]" a.txt ccccccccccccccc2222
(匹配单个十进制数字存在的行)
5、[:alnum:]:所有的字母和十进制数字;
[[email protected] ~]# egrep "[[:alnum:]]" a.txt DDDDDDDDDDDDDCCCCCC AAACACABCAAABCAAAAA aaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbb ccccccccccccccc2222
(匹配所有的字母和十进制数字)
6、[:punct:]:所有的符号
[[email protected] ~]# egrep "[[:punct:]]" a.txt $######@@@#$$$##@@# &*(^())(_(&%[email protected]#$$^*
(匹配所有符号存在的行)
7、[:space:]:表示空白字符,包括空格和制表符;
[[email protected] ~]# egrep "[[:space:]]" a.txt |wc -l 3
(匹配空白字符存在的行,在此文件中有三行)
8、[a-z]:只表示所有的小写字母;
[[email protected] ~]# egrep "[a-z]" a.txt aaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbb ccccccccccccccc2222
(匹配所有小写字母存在的行)
9、[A-Z]:只表示所有的大写字母;
[[email protected] ~]# egrep "[A-Z]" a.txt DDDDDDDDDDDDDCCCCCC AAACACABCAAABCAAAAA
(匹配所有大写字母存在的行)
10、[0-9]:仅表示所有的十进制数码;
[[email protected] ~]# egrep "[0-9]" a.txt ccccccccccccccc2222
(匹配所有小写字母存在的行)
次数匹配类:该类字符前面的一个字符可以出现的次数;
1、*:其前面的字符可以出现任意次,即:0次,1次或多次;
[[email protected] ~]# egrep "AAA*" a.txt AAACACABCAAABCAAAAA
(匹配有AAA的行)
2、?:其前面的字符可有可无,即:0次或1次;
[[email protected] ~]# echo /etc/passwd | egrep -o "[^/]*/?$" passwd
(输出某个路径的基名)
3、{m,n}:其前面的字符至少出现m次,最多不超过n次;
[[email protected] ~]# egrep "A{2,5}" a.txt AAACACABCAAABCAAAAA
(匹配打A的行中,A至少出现2次,不能超过5次)
4、{m}:其前面的字符必须出现m次;
[[email protected] ~]# egrep "A{5}" a.txt AAACACABCAAABCAAAAA
(匹配打的A在本行中必须出现5次,匹配结果是最后的AAAAA)
5、{m,}:其前面的字符至少出现m次;
[[email protected] ~]# egrep "A{1,}" a.txt AAACACABCAAABCAAAAA
(匹配到的A至少出现1次,即结果中的A全部匹配到)
6、{,n}:其前面的字符至少出现0次,最多不超过n次;
[[email protected] ~]# egrep "a{,1}" b.txt aabaaabacccvv ababababababa cccccccccccca
(匹配到的a至少出现0次,最多不超过1
次)
7、注意:在正则表达式中,表示任意长度的任意字符:".*"
[[email protected] ~]# grep "^[[:space:]].*" /etc/grub2.cfg
(找出/etc/grub2.cfg以空白字符开头的非空白行;)
位置锚定字符:
行锚定:
行首锚定:^
行尾锚定:$
[[email protected] ~]# egrep "^[[:space:]]*$" /etc/grub2.cfg | wc -l 17
(匹配/etc/grub2.cfg空白行数)
字锚定
字首锚定:\<或\b
字尾锚定:\>或\b
[[email protected] ~]# ifconfig | egrep "\<[0-9]\>|\<[1-9][0-9]\>"
(找出ifconfig一位数或者两位数)
分组与前向引用字符:
():将()中包含的内容作为一个不可分割的整体来处理;
\1,\2,\3...:前向引用字符,
是正则表达式处理引擎的内置变量,\1表示前面所出现的第一组小括号中所阔扩选的内容;\2表示前面所出现的第二组小括号中扩选的内容;...
[[email protected] ~]# grep "^(root).*\1" /etc/passwd root:x:0:0:root:/root:/bin/bash
或者:
|:将其左右的字符或字符串当做整体来对待;
"C|cat" C cat
[[email protected] ~]# ifconfig | grep "\<[0-9]\>|\<[1-9][0-9]\>"
(找出ifconfig中一位数或者两位数)
grep系中常用命令:
1、-A num:同时显示被PATTERN匹配到的行及其后续num行;
[[email protected] ~]# grep -A 2 "^root" /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin
2、-B num:同时显示被PATTERN匹配到的行及其前面num行;
[[email protected] ~]# grep -B 2 "^xwl" /etc/passwd postfix:x:89:89::/var/spool/postfix:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin xwl:x:1000:1000:XWL:/home/xwl:/bin/bash
3、-C num:同时显示被PATTERN匹配到的行及其前后num行;
[[email protected] ~]# grep -C 2 "^sshd" /etc/passwd gdm:x:42:42::/var/lib/gdm:/sbin/nologin gnome-initial-setup:x:988:983::/run/gnome-initial-setup/:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin
4、--color[=WHEN]:以高亮颜色表示被匹配到的内容;
[[email protected] ~]# grep --color=auto ‘^sshd‘ /etc/passwd sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
(sshd为加上颜色的)
5、-c,--count:不输出被PATTERN匹配的行的内容,而是输出被PATTERN匹配到的行数;
[[email protected] ~]# grep -c "^[[:space:]]*$" /etc/grub2.cfg 17
6、-E:可以使GREP命令支持扩展正则表达式元字符;相当于egrep命令;
[[email protected] ~]# ifconfig | grep -E "\<[0-9]\>|\<[1-9][0-9]\>"
7、-F:--fixed-string:相当于fgrep;
8、-e PATTERN, --regexp=PATTERN:指定多个模式PATTERN在一个命令行中生效;
[[email protected] ~]# grep -e "AAA*" -e "aaa*" a.txt AAACACABCAAABCAAAAC aaaaaaaaaaaaaaaaaaa
9、-f FILE, --file=FILE:从指定的文件中读取多个PATTERN用于一次搜索;
[[email protected] ~]# cat a.txt | grep -f b.sh $######@@@#$$$##@@# &*(^())(_(&%[email protected]#$$^*
(从其中找出相同的字符进行匹配)
10、-i, --ignore-case:忽略文件中的字符的大小写;
[[email protected] ~]# grep -i "[[:upper:]]" a.txt DDDDDDDDDDDDDCCCCCC AAACACABCAAABCAAAAC aaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbb ccccccccccccccc2222
(-i忽略大小写,本来是匹配大写字母,最后连小写字母也一起匹配上)
11、-o, --only-matching:仅显示被PATTERN匹配到的部分;关闭了贪婪模式;
(取得字符串很有用)
[[email protected] ~]# echo /etc/passwd | grep -o "[^/]*/\?$" [[email protected] ~]# passwd
(取出/etc/passwd路径中的基名)
12、-q, --quiet, --silent:安静模式;没有输出结果;相当于grep > /dev/null
13、-v, --invert-match:显示没有被PATTERN匹配到的行;
[[email protected] ~]# grep -v "^[[:space:]]*$" /etc/grub2.cfg | wc -l 123
以上是关于grepegrep命令及正则表达式的主要内容,如果未能解决你的问题,请参考以下文章
编程语言和shell编程的基础内容以及grepegrep命令及相应的正则表达式和用法