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:]_]+