对文本内容进行过滤,查找,匹配,正则可以匹配完整的大小写
1.元字符
. 表示任意单个字符
转义符:\
()分组 \(\)
【】指定范围之内的任意单个字符
【0-9a-zA-Z】
【^az】:取反,显示不包含的内容
【【:blank】】:匹配空格,不是tab键的
2.表示次数:
*:匹配前面的字符任意次,包括0次尽可能长的匹配 echo gooogle | grep "go*gle":表示这个o匹配几个可以为0或者多个
.*:匹配前面的字符任意次,不包括0次,也就匹配所有 echo ggle | grep "go.*gle"
\?:匹配前面的字符出现0次或者1次有且只有一次
\+:匹配前面出现的字符,至少得有一次,就是>=1
\{n\}:匹配前面出现的字符等于几次 echo google | grep “go\{2\}gle"
\{m,n\} :最少m次,最多n次
\{,n\}:匹配前面的字符最多n次,没有也算
\{n,\}:匹配前面的字符最少n次,只有连续出现n次,后面的都算
通配符:
匹配的是文件名,而且不能精确的匹配大小写
匹配ens33的ip地址和mac地址
ifconfig ens33 | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"
位置锚定:
^:行首锚定,以什么为开头 cat /etc/passwd | grep "^root"
$:行尾锚定,以什么为结尾 cat /etc/passwd | grep "bash$"
^root$:匹配行模式 ,单独的一行只有root
^$:开头为空,空白行
^[[:space:]]*$
cat /etc/fstab | grep "^[^#]" 匹配非#行
\<或者\b 词首锚定 用于匹配单词模式的左侧 echo hello -123 | grep "\bhello"
从左往右全部都算,所有一起都包含,所有算匹配到
\> 或者\b 词尾锚定 用于匹配单词模式的右侧 echo hello -123 | grep "\b123"
只匹配右侧的单词,左侧的单词不匹配
\broot\b:匹配整个单词
\<root\>:匹配整个单词
3.分组以及逻辑或
() 分组
\| 或者
举例:
echo abcabcabc | grep "\(abc\)\{3\}"
echo golgogle | grep "\(go\)\{1\}"
echo golgogle | grep "\(go\)\{1\}gle"
echo 1abc | grep "1\|2abc"
echo 1abc2bc | grep "\(1\|2\)abc"
4.扩展正则表达式
grep -E 扩展正则表达式 不需要加 \ 了
egrep 也可以
025-83346023
0512-8776655
021-8998877
cat 123.txt | grep -E "[0-9]{3,4}+-[0-9]{8}"
cat 123.txt | grep -E "[0-9a-zA-Z]+@[0-9a-zA-Z]+\.[0-9a-zA-Z]+
cat 123.txt | grep -E "[0-9]{5,10}+@[q]{2}+\.[com]+"
cat 123.txt | grep -E "[0-9|()]+|()-[0-9]{3}|-[0-9]+"
987-123-4567
987 456-1230
(123) 456-7890
cat 123.txt | grep -E "^(\([0-9]+\)|[0-9]+)[ -]?[0-9]+-[0-9]+"
cat 123.txt | grep -E "\(?[0-9]+\)?[ -]?[0-9]+-[0-9]+"