linux grep egrep fgrep 正则表达式:
grep是一个最初用于Unix操作系统的命令行工具。在给出文件列表或标准输入后,grep会对匹配一个或多个正则表达式的文本进行搜索,并只输出匹配(或者不匹配)的行或文本。
grep命令:
命令语法:
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
-i:忽略大小写对文件内容进行匹配。
-v:反向匹配,根据用户输入的信息取反。
-o: 输入匹配的是什么,输出的就是什么,而不是显示匹配字串的一整行。
-E:grep的扩展,或者使用egrep命令。
--color: 匹配到的字符显示颜色。
示例:
直接搜索root所在行:
# grep 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
忽略大小写搜索:
#grep -i 'abcDEFg' test.txt
ABCDEFG
abcdefg
ABcdefg
abcdeFG
反向搜索:
#grep -v 'ABCDEFG' test.txt
abcdefg
ABcdefg
abcdeFG
只显示匹配到的字符而不是一行:
#grep -o 'ABC' test.txt
ABC
*)grep -E 或者 egrep 的基本命令都是差不多一致的。
正则表达式:regex
正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
基本正则表达式:grep
fgrep: 不支持使用正则表达式,如果输入'*',直接匹配文本字面意思,就只匹配文本内带'*'的行。
基本正则表达式元字符:
字符匹配:
. : 匹配任意'单个'字符,包括标点符号,特殊字符。
[] : 匹配指定范围内的任意单个字符。
[^]: 反向匹配任意单个字符。
针对[]又有几个扩展的元字符:
*)这里也支持一些字符合集,写在后面了。
次数匹配元字符:
用于实现'指定前面字符'所能够出现的次数。
位置锚定:
^ : 行首锚定,写在匹配字符的左侧。
$ :行尾锚定,写在匹配字符的右侧。
^$: 空白行。
\<: 词首,出现于单词左侧 \b。
\>: 词尾,出现于单词右侧 \b。
分组:
分组是因为被匹配的内容在文件中出现多次,而不需要多次输入同样的信息去匹配。
\(\):在括号内,可以出现任何正确的正则表达式匹配。
\(\) \1 :引用第一个左括号以及与之对应的右括号所包括的所有内容。
字符集合:
数字:[:dihit:]
小写字母:[:lower:]
大写字母:[:upper:]
标点符号:[:punct:]
空白字符:[:space:]
所有字母:[:alpha:]
所有数字:[:alnum:]
*)在引用字符合集的时候需要如[[:space:]]这样使用。
一些egrep所支持的正则表达式匹配模式在grep里也可以实现,例如:\|(或) \+(前面的字符至少出现1次)等,都是需要加\转义。
扩展正则表达式: egrep
*)元字符匹配与grep基本正则表达式匹配一致,包括位置锚定,字符合集。
次数匹配:
* :星号在扩展正则表达式和基本正则表达式匹配一至,并且在基本正则表达式中不用加\进行转义。
? :匹配前面的字符可以出现任意次,包括0次。
+ :匹配前面的字符至少出现1次。
{m}: 匹配前面的字符至少出现m次。
{m,n}:匹配前面的字符至少出现m次,至多n次。
分组:
()\1: :引用第一个左括号以及与之对应的右括号所包括的所有内容。
或者:
正则表达式示例:
正则表达式可以进行组合匹配。
匹配/etc/passwd文件中有多少个以/sbin/nologin结尾的。
grep '.*:/sbin/nologin$' /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
匹配 /boot/grub/grub.conf至少一个空白字符开头的行统计行数。
grep '^[[:space:]]\{1,\}' /boot/grub/grub.conf | wc -l
3
匹配/boot/grub/grub.conf以#号开头,后面至少一个空白符的行。
grep '^#[[:space:]]\{1,\}.*' /boot/grub/grub.conf
# grub.conf generated by anaconda
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/mapper/vg0-root
# initrd /initrd-[generic-]version.img
匹配一个合理的IPV4地址:
1、A类:1-127
2、B类:128-191
3、C类:192-223
我这边匹配的范围是:
1.0.0.1-239.255.255.255
ifconfig | egrep '\<([1-9]|[0-9][0-9]|1[0-9][0-9]|2[0-3][0-9]|23[0-9])\>'.'\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'.'\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'.'\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'
inet addr:192.168.0.103 Bcast:192.168.0.255 Mask:255.255.255.0
inet addr:192.168.0.102 Bcast:192.168.0.255 Mask:255.255.255.0
inet addr:127.0.0.1 Mask:255.0.0.0
我这边是用笨方法匹配的,最后看了下网上很多的匹配,比这个要简化好多。
匹配思路:
1.0.0.1-239.255.255.255
第一位数(第一个小数点的前一位)的匹配最小是1,最大是239。第二位数的匹配最小是0,最大是255,第三位和第二位一样。第四位是最小1,最大255.
第一位数:
个位数:1-9
十位数:10到100 [0-9][0-9]
百位数:100到199 1[0-9][0-9]。200到239 2[0-3][0-9],239是23[0-9]
百位数解释:200-249,2[0-4][0-9]。240-249,24[0-9]。
总结反思: 不要看到人家的一长串代码而感到头大,一个一个慢慢对照自己所会的正则匹配,一点一点理出头绪。进行匹配的时候,要注意匹配要求,确定是要锚定开头还是行尾,先考虑下后在进行匹配。一般次数匹配前面都会出现一些字符,要求这个字符出现多少多少次。词首词尾锚定是根据单词来锚定的。我出现问题比较多的就是习惯性把次数放在前面,例如用我最初的理解匹配:开头至少一个空白符'^\+[[:space:]]':。实际写法是'^[[:space:]]\+',锚定行首,前面空白字符至少出现1次。总之就是稍微细心些就好。
转载于:https://blog.51cto.com/54276311/1436196