hello world
hi hello
hello ,zsy
hello
打印以hello
开头的行
grep "^hello"
输出
hello world
hello ,zsy
hello
打印以hello
结尾的行
grep "hello$"
输出
hi hello
hello
打印只有一个hello
的行
grep -n "^hello$" test.log
输出
5:hello
匹配空行
grep -n "^$" test.log
输出
4:
包含以wo
为开头的单词的行
grep -n "\ test.log
grep -n "\bwo" test.log
输出
1:hello world
包含以rld
为结尾的单词的行
grep -n "rld\>" test.log
grep -n "rld\b" test.log
输出
1:hello world
包含单词 hello
的行
grep -n "\" test.log
输出
1:hello world
2:hi hello
3:hello ,zsy
5:hello
注意 hellohello
不会被匹配到
TODO:如果查hello
开头或 hello
结尾 怎么办
包含 wo
但是不以wo
为开头的单词的行
grep -n "\Bwo" test.log
输出
2:hello myworld
a a
aa
aaa
aaaa
b
ab
aab
包含 出现连续两个a
的单词的行
grep -n "a\{2\}" test.log
输出
2: aa
3: aaa
4: aaaa
7: aab
注意 大于n次的也能输出
包含 只出现连续两个a
的单词的行
grep -n "\" test.log
输出
2: aa
包含 只出现连续2个至4个a
的单词的行
grep -n "a\{2,4\}" test.log
输出结果
2: aa
3: aaa
4: aaaa
7: aab
至少出现两个连续的a
grep -n "a\{2,\}" test.log
输出结果
2: aa
3: aaa
4: aaaa
7: aab
最多出现两个连续的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
grep -n "a\?b" test.log
输出结果
5:b
6:ab
7:aab
grep -n "a\+b" test.log
输出结果
6:ab
7:aab
abcd
aBcD
aBCD
z1
za
z$
grep -n "a[[:alpha:]]\{3\}" test.log
输出
1:abcd
2:aBcD
3:aBCD
grep -n "a[[:lower:]]\{3\}" test.log
输出
1:abcd
grep -n "a[[:upper:]]\{3\}" test.log
输出
3:aBCD
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次