linux正则表达式

正则表达式

通配符的功能为匹配文件名的 文件名中的字符串
正则表达式用来匹配文本中特定的字符串的
通配符用来匹配现有文件
正则表达式用来匹配字符串的

.   匹配任意单个字符,可以是一个汉字
[]  匹配指定范围内的任意单个字符,示例:[abc] [0-9] [a-z] [a-zA-Z]
[^] 匹配指定范围外的任意单个字符,示例:[^abc]
[:alnum:] 匹配字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
*   匹配前面的字符任意次,包括0次,尽可能长的匹配
.*  任意长度的任意字符
\?  匹配其前面的字符出现0次或1次,即:可有可无
\+  匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
\{n\}   匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\}  匹配前面的字符至多n次,<=n
\{n,\}  匹配前面的字符至少n次

匹配次数:
grep "r..t" /etc/passwd 匹配出/etc/passwd中以r字符开头中间两个字符任意的后以t字符结尾的

ls | grep 'file[^a-z].txt'
ls | grep 'file[^a.z].txt'
此时的中括号里的.就表示单纯的点,不表示匹配任意字符,后面的点依旧表示匹配任意一个字符
[root@localhost ~]# echo file1.txt | grep 'file[^a.z].txt'
file1.txt
[root@localhost ~]# echo file12txt | grep 'file[^a.z].txt'
file12txt

echo file12txt | grep 'file[^az].txt'  此时的.就表示匹配任意一个字符
[root@localhost ~]# echo file12txt | grep 'file[^az].txt'
file12txt
[root@localhost ~]# echo file1.txt | grep 'file[^az].txt'
file1.txt
[root@localhost ~]# echo file..txt | grep 'file[^az].txt'
file..txt
echo google | grep "go\{2\}gle"  匹配出现oo的字符串  匹配前面的字符2次
echo goooooooooogle | grep "go\{6,\}gle"   匹配前面的字符至少6次
echo google | grep "go*gle"   可以匹配出 ggle  gogle google gooogle  
echo gggle |grep "go*gle"
[root@localhost ~]# echo gggle |grep "go*gle"   grep会将匹配到的都列出来
gggle
[root@localhost ~]# echo ggle | grep "g.*gle"   .*匹配任意长度的任意字符
ggle
[root@localhost ~]# echo gofgvvfsdffggle | grep "g.*gle"
gofgvvfsdffggle
[root@localhost ~]# echo gogle | grep "go\?gle"  匹配前面的字符0次或1次
gogle
[root@localhost ~]# echo ggle | grep "go\?gle"
ggle
echo google | grep "go\?gle"  不满足条件
[root@localhost ~]# echo gogle | grep "go\+"     \+ 表示匹配一个及以上
gogle

* 表示匹配前面的字符任意次,包括0次,尽可能长的匹配

echo goooooooxxxgle | grep "go*"

图片

echo gooxgxgoooole | grep "go*"

图片

定位位置:

找到/etc/fstab文件中不是以#开头的内容
[root@localhost ~]# grep "^[^#]" /etc/fstab
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=fd5accf9-a52a-49cf-969e-51a310e1c025 /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
第一个^表示行首 第二个^表示非#

匹配行尾
[root@localhost ~]# grep 'bash$' /etc/passwd
root:x:0:0:root:/root:/bin/bash
yc:x:1000:1000:yc:/home/yc:/bin/bash

grep "^google$" test.txt

匹配空行
grep '^$' test.txt

匹配空格行 
grep '^[[:space:]]*$' test.txt -n

匹配单词  单词以-为分界符 注意: 单词是由字母,数字,下划线组成
echo hello-123 | grep '\<123'
[root@localhost ~]# echo hello-123 | grep '\<123'
hello-123
hello算一个单词 123算一个单词

[root@localhost ~]# echo xyz-hello:123 | grep '\<hello\>'
xyz-hello:123

分组

echo abcabcabc | grep "(abc){3}"

echo 1 | grep "1\|2"  表示或1或2

echo 1abc | grep "1\|2abc"  表示 1 或 2abc

echo 1abc | grep "1abc\|2abc"  表示1abc或2abc
echo 1abc | grep "\(1\|2\)abc"
图片 --- 图片

案例:
正则表达式取主机IP地址:

grep -i 忽略大小写
grep -o 只列出正则表达式匹配到的

图片 --- 图片 --- 图片

分组的方法取ip地址

\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}

[root@localhost ~]# ifconfig eno16777736 | grep -i  mask | grep -o '\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}' | head -1
192.168.42.200

扩展正则表达式:

. 任意单个字符
[abc]  指定范围的字符
[^abc] 不在指定范围的字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
* 匹配前面字符任意次
? 0或1次
+ 1次或多次
{n} 匹配n次
{m,n} 至少m,至多n次
^ 行首
$ 行尾
\<, \b 语首
\>, \b 语尾
() 分组
| 或者
a|b a或b

使用扩展的正则表达式取IP地址:

([0-9]{1,3}\.){3}[0-9]{1,3}

[root@localhost ~]# ifconfig eno16777736 | grep -i  mask | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' | head -1
192.168.42.200

其它案例:

正则表达式匹配QQ号
[root@localhost ~]# echo 1888888888 | grep -E  '\<[0-9]{6,12}\>'
1888888888
正则表达式匹配电话号码
\<1[3456789][0-9]{9}\>
[root@localhost ~]# echo 18888888888 | grep -E '\<1[3456789][0-9]{9}\>'
18888888888
正则表达式匹配邮箱
[[:alnum:]_]+@[[:alnum:]_]+\.[[:alnum:]_]+
posted @ 2021-10-23 22:52  咚咚小孩  阅读(130)  评论(0)    收藏  举报