第3节 基本和扩展正则
举个例子
[^ming] 不是m、i、n、g的字符
[0-9]
[[:lower:]] 任意一个小写字母
. 任意一个非\n的字符
* 前一个字符出现0次或N次
a\? a出现了0次或1次,可有可无的表达方式
a\+ a出现1次及以上
a\{10\} a出现了10次
a\{10,20\} 10到20次
a\{,20\} 20次以下
a\{10,\} 10次以上
.* 所有但是不能匹配\n,所以你用.*抓全文只能抓到换行符就结束了,
.*等价于通配符里的*
位置锚定
[16:47:46 root@host1 ~]#grep -v "^#" /etc/fstab
/dev/mapper/centos_host1-root / xfs defaults 0 0
UUID=e36eac36-1940-4883-8c19-a05f6b4bb4a6 /boot xfs defaults 0 0
/dev/mapper/centos_host1-swap swap swap defaults 0 0
[16:47:55 root@host1 ~]#
[16:47:56 root@host1 ~]#
[16:47:56 root@host1 ~]#grep ^[^#] /etc/fstab
/dev/mapper/centos_host1-root / xfs defaults 0 0
UUID=e36eac36-1940-4883-8c19-a05f6b4bb4a6 /boot xfs defaults 0 0
/dev/mapper/centos_host1-swap swap swap defaults 0 0
[16:48:07 root@host1 ~]#


上图注意下,grep -v "^#" 和 grep "^[^#]"的区别,明显第二种也过滤空行。因为[^#]里面至少的又一个字符的。

这种[^#]写法是有问题的,不推荐这么写。

搜索shutdown行尾👆


[[:space:]]他不仅仅抓空格,还抓TAB。当然上图其实都是空格,因为做了4空格等1tab的设置,取消后再验证下

还是[[:space:]]能够抓到空格和TAB的。没问题。注意一个细节,cat -A 是能够区分TAB和空格的,但是如果你优化了tab=4空格,那么就自然都是空格了。-A看到的都是空格了就。
搜索空行👆

单词:在系统中,数字字母下划线都算单词的范畴。此外都不算单词。

空行是^$,空白行^[[:space:]]*$






注意,写的思路:
:%s///g
:%s/(abc)(123)/1eradmin2/g
:%s/(abc)(123)/\1eradmin\2/g

👆这个叫后向引用,在后面的sed搜索替代有关
nginx里也有后向引用的


[17:30:32 root@host1 ~]#echo rootrootxxroot |grep -E "(root){2}"
rootrootxxroot
👆抓两连续的root



练习

4题
cat /etc/passwd |grep -E "[0-9]{2,3}" -o | grep -Ev ^0 👈这是错误的,因为4位数也会搜出来的比如65534这个数字也会当作655和34两个匹配结果的,需要词尾锚定
cat /etc/passwd |grep -E "/<[0-9]{2,3}/>" -o | grep -Ev ^0

注意该方法由于是:xx:所以对于后面的数字是不匹配的。



方法一肯定只能是抓出第一个段数字,
方法二可以匹配所有数字

---





词尾铆钉的必要性👇





扩展正则


grep -E还是有一些还是需要加\的。



nginx的后向引用举例

这是nginx里的rewrite替换的正则写法

windows里也有正则