Linux日志查找——正则表达式

文章目录

    • 基础
      • 文件内容
      • 一行以xx开头 ^
      • 一行以xx结尾 $
      • 只包含xx一个单词 ^ $
      • 空行 ^$
      • 词首 \\< 或 \b
      • 词尾 \\> 或 \b
      • 独立单词 \\< \\>
      • 非单词边界 \B
    • 连续次数匹配
      • 文件内容
      • 连续n个字符 \\{ \\}
      • 只出现n次的字符 \\< \{ \}\\>
      • 出现的次数在x与y之间 \\{x,y\\}
      • 至少连续出现x次 \\{x,\\}
      • 至多出现x次 \\{,x\\}
      • 之前字符连续出现任意次数 *
      • 匹配任意单个字符 .
      • 匹配前面的字符 0次或1次 \?
      • 匹配前面的字符至少1次 \\+
    • 常用符号
      • 文件内容
      • 任意字母 [[:alpha]] 或 [a-zA-Z]
      • 任意小写字母 [[:lower:]] 或 [a-z]
      • 任意大写字母 [[:upper:]] 或 [A-Z]
      • 任意数字 [[:digit:]] 或 [0-9] 或 \d
      • 某几个字符中的一个 []
      • 不在某个范围内 [^]
      • 其他简写格式
    • 分组和后向引用
      • 文件内容
      • 分组 ()
      • 分组嵌套 (())
      • 后向引用
    • 转义符
    • 扩展正则表达式

基础

文件内容

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 "\ 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 "\" 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 "\" 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次

你可能感兴趣的:(Linux命令,Linux日志查找,正则表达式,日志查找)