基础
文件内容
hello world
hi hello
hello ,zsy
hello
一行以xx开头 ^
打印以hello
开头的行
grep "^hello"
输出
hello world
hello ,zsy
hello
一行以xx结尾 $
打印以hello
结尾的行
grep "hello$"
输出
hi hello
hello
只包含xx一个单词 ^ $
打印只有一个hello
的行
grep -n "^hello$" test.log
输出
5:hello
空行 ^$
匹配空行
grep -n "^$" test.log
输出
4:
词首 \< 或 \b
包含以wo
为开头的单词的行
grep -n "\<wo" test.log
grep -n "\bwo" test.log
输出
1:hello world
词尾 \> 或 \b
包含以rld
为结尾的单词的行
grep -n "rld\>" test.log
grep -n "rld\b" test.log
输出
1:hello world
独立单词 \< \>
包含单词 hello
的行
grep -n "\<hello\>" test.log
输出
1:hello world
2:hi hello
3:hello ,zsy
5:hello
注意 hellohello
不会被匹配到
TODO:如果查hello
开头或 hello
结尾 怎么办
非单词边界 \B
包含 wo
但是不以wo
为开头的单词的行
grep -n "\Bwo" test.log
输出
2:hello myworld
连续次数匹配
文件内容
a a
aa
aaa
aaaa
b
ab
aab
连续n个字符 \{ \}
包含 出现连续两个a
的单词的行
grep -n "a\{2\}" test.log
输出
2: aa
3: aaa
4: aaaa
7: aab
注意 大于n次的也能输出
只出现n次的字符 \< { }\>
包含 只出现连续两个a
的单词的行
grep -n "\<a\{2\}\>" test.log
输出
2: aa
出现的次数在x与y之间 \{x,y\}
包含 只出现连续2个至4个a
的单词的行
grep -n "a\{2,4\}" test.log
输出结果
2: aa
3: aaa
4: aaaa
7: aab
至少连续出现x次 \{x,\}
至少出现两个连续的a
grep -n "a\{2,\}" test.log
输出结果
2: aa
3: aaa
4: aaaa
7: aab
至多出现x次 \{,x\}
最多出现两个连续的a
grep -n "a\{,2\}" test.log # 这种写法报错,原因待查 用下面方法代替
grep -n "a\{0,2\}" test.log
输出结果
1: a a
2: aa
3: aaa
4: aaaa
5: b
6: ab
7: aab
之前字符连续出现任意次数 *
grep -n "a*b" test.log
输出结果
5: b
6: ab
7: aab
匹配任意单个字符 .
grep -n -E "..b" test.log
输出结果
7:aab
匹配前面的字符 0次或1次 ?
grep -n "a\?b" test.log
输出结果
5:b
6:ab
7:aab
匹配前面的字符至少1次 \+
grep -n "a\+b" test.log
输出结果
6:ab
7:aab
常用符号
文件内容
abcd
aBcD
aBCD
z1
za
z$
任意字母 [[:alpha]] 或 [a-zA-Z]
grep -n "a[[:alpha:]]\{3\}" test.log
输出
1:abcd
2:aBcD
3:aBCD
任意小写字母 [[:lower:]] 或 [a-z]
grep -n "a[[:lower:]]\{3\}" test.log
输出
1:abcd
任意大写字母 [[:upper:]] 或 [A-Z]
grep -n "a[[:upper:]]\{3\}" test.log
输出
3:aBCD
任意数字 [[:digit:]] 或 [0-9] 或 \d
grep -n "z[[:digit:]]" test.log
输出
4:z1
注意:不是多有的正则表达式处理器都能处理 \d,如果让 grep识别,需要加蚕食 -P
某几个字符中的一个 []
grep -n "z[1a]" test.log
输出
4:z1
5:za
不在某个范围内 [^]
grep -n "z[^1a]" test.log
输出
6:z$
其他简写格式
\d 表示任意单个0-9的数字
\D表示任意单个非数字字符
\t表示匹配单个横向制表符
\s表示匹配单个空白字符,包括 空格和tab制表符
\S表示匹配单个非空白字符
分组和后向引用
文件内容
hello hello
abcbcabcbc -- bc
hello world hello
hello world hiiii
hello world hiiii -- hiiii
分组 ()
grep "\(hello\)\{2\}" test.log
输出
hellohello
分组嵌套 (())
grep "\(a\(bc\)\{2\}\)\{2\}" test.log
输出
abcbcabcbc -- bc
后向引用
假设筛选条件:world
之前的字符串和之后的字符串相等。并且都是h开头
grep -n "\(h.\{4\}\) world \1" test.log
其中 \1表示与第一个正则表达式匹配到的结果相同 即 hello
输出
hello world hello
同理
grep -n "\(h.\{4\}\) world \(h.\{4\}\) -- \2" test.log
输出
5:hello world hiiii -- hiiii
其中 \2表示与第一个正则表达式匹配到的结果相同 即 hiiii
注意 当分组嵌套的时候 按照左括号的顺序区分1和2
转义符
. | \. |
---|---|
* | \* |
? | ? (\?表示0个或1个,?不用转义) |
+ | + |
\ | \\ 注意设计反斜杠 正则表达式用单引号括起来 |
扩展正则表达式
grep 命令只支持默认的正则表达式,如果想让它支持扩展正则表达式,在命令中增加 -E
有些符号是通用的,比如
. 表示任意单个字符。
* 表示前面的字符连续出现任意次,包括0次。
.* 表示任意长度的任意字符,与通配符中的*的意思相同。
\ 表示转义符,当与正则表达式中的符号结合时表示符号本身。
[ ]表示匹配指定范围内的任意单个字符。
[^ ]表示匹配指定范围外的任意单个字符。
[[:alpha:]] 表示任意大小写字母。
[[:lower:]] 表示任意小写字母。
[[:upper:]] 表示任意大写字母。
[[:digit:]] 表示0到9之间的任意单个数字(包括0和9)。
[[:alnum:]] 表示任意数字或字母。
[[:space:]] 表示任意空白字符,包括"空格"、"tab键"等。
[[:punct:]] 表示任意标点符号。
[^[:alpha:]] 表示单个非字母字符。
[^[:lower:]] 表示单个非小写字母字符。
[^[:upper:]] 表示单个非大写字母字符。
[^[:digit:]] 表示单个非数字字符。
[^[:alnum:]] 表示单个非数字非字母字符。
[^[:space:]] 表示单个非空白字符。
[^[:punct:]] 表示单个非标点符号字符。
[0-9]与[[:digit:]]等效。
[a-z]与[[:lower:]]等效。
[A-Z]与[[:upper:]]等效。
[a-zA-Z]与[[:alpha:]]等效。
[a-zA-Z0-9]与[[:alnum:]]等效。
[^0-9]与[^[:digit:]]等效。
[^a-z]与[^[:lower:]]等效。
[^A-Z]与[^[:upper:]]等效
[^a-zA-Z]与[^[:alpha:]]等效
[^a-zA-Z0-9]与[^[:alnum:]]等效
^:表示锚定行首,此字符后面的任意内容必须出现在行首,才能匹配。
$:表示锚定行尾,此字符前面的任意内容必须出现在行尾,才能匹配。
^$:表示匹配空行,这里所描述的空行表示"回车",而"空格"或"tab"等都不能算作此处所描述的空行。
^abc$:表示abc独占一行时,会被匹配到。
\<或者\b :匹配单词边界,表示锚定词首,其后面的字符必须作为单词首部出现。
\>或者\b :匹配单词边界,表示锚定词尾,其前面的字符必须作为单词尾部出现。
\B:匹配非单词边界,与\b正好相反。
不通用的命令主要体现在 扩展通用表达式可以省略 \
() 表示分组
\1 表示引种整个表达式中第1个分组中的正则匹配符到的结果
\2 表示引种整个表达式中第2个分组中的正则匹配符到的结果
?表示匹配前面的字符0次或1次
+ 表示匹配前面的字符至少1次
{n} 表示前面的字符连续出现n次
{x,y} 表示之前的字符出现的次数在x与y之间
{,n}表示之前的字符连续出现至多n次,可以0次
{n,}表示之前的字符出现至少n次