使用模式 Grep 多个单词
Grep Multiple words using a pattern
我有一个要求,如果模式匹配,我需要从日志文件中 grep 多个字符串
下面是日志snapshot:access.log
12.12.137.16 - RMC1 [06/Jul/2016:07:34:17 -0700] "GET /identity/afr/partition/ie/n/default/opt/grid-11.1.1.9.0-5358.js HTTP/1.1" 200 9318
12.12.137.16 - BMC1 [06/Jul/2016:07:34:17 -0700] "GET /identity/ HTTP/1.1" 200 6788
12.12.137.16 - RMC1 [06/Jul/2016:07:34:17 -0700] "GET /identity/afr/partition/ie/n/default/opt/status-11.1.1.9.0-5358.js HTTP/1.1" 200 2297
12.12.137.16 - RMC1 [06/Jul/2016:07:34:17 -0700] "GET /identity/afr/partition/ie/n/default/opt/poll-11.1.1.9.0-5358.js HTTP/1.1" 200 2098
12.12.137.16 - RMC1 [06/Jul/2016:07:34:18 -0700] "GET /identity/afr/alta-v1/overflow_right_ena.png HTTP/1.1" 200 1082
12.12.137.16 - RMC1 [06/Jul/2016:07:34:18 -0700] "GET /identity/ HTTP/1.1" 200 6749
12.12.137.16 - RMC1 [06/Jul/2016:07:34:18 -0700] "GET /identity/afr/alta-v1/conv_l_ena.png HTTP/1.1" 200 1161
12.12.137.16 - RMC1 [06/Jul/2016:07:34:24 -0700] "GET /identity/ HTTP/1.1" 200 6799
12.12.137.16 - RMC1 [06/Jul/2016:07:34:27 -0700] "GET /identity/images/Dashboard/myAccess_s2.png HTTP/1.1" 200 6885
12.12.137.16 - SSS1 [06/Jul/2016:07:34:24 -0700] "POST /identity/faces/home?_adf.ctrl-state=o9l9q161v_5 HTTP/1.1" 200 41776
如果模式与日志文件中的 /identity /HTTP/1.1
匹配,则想要 grep 用户名和时间字段
所以我的输出将是:
BMC1 06/Jul/2016:07:34:17
RMC1 06/Jul/2016:07:34:18
RMC1 06/Jul/2016:07:34:24
尝试过:
grep -E '/identity/ HTTP/1.1' *.log
但它给出了整行。
请协助
使用 awk
$ awk -F'[][ ]+' '/\/identity\/ HTTP\/1[.]1/{print ,}' access.log
BMC1 06/Jul/2016:07:34:17
RMC1 06/Jul/2016:07:34:18
RMC1 06/Jul/2016:07:34:24
工作原理:
-F'[][ ]+'
这会将字段分隔符设置为 [
、]
或 space、
的任意组合
/\/identity\/ HTTP\/1[.]1/{print ,}
这将选择感兴趣的行并仅打印第三和第四个字段。
使用 sed
$ sed -n '\|/identity/ HTTP/1[.]1|{s/^.* - //; s/[[]//; s/[]].*//; p;}' access.log
BMC1 06/Jul/2016:07:34:17 -0700
RMC1 06/Jul/2016:07:34:18 -0700
RMC1 06/Jul/2016:07:34:24 -0700
工作原理:
-n
这告诉 sed 除非我们明确要求,否则不要打印任何东西。
\|/identity/ HTTP/1[.]1|
这将选择感兴趣的行。
s/^.* - //; s/[[]//; s/[]].*//
对于选定的行,这三个替换命令从行中删除不需要的部分。
p
这告诉 sed 在我们进行替换后打印所选行的剩余部分。
使用grep -P
如果你的 grep 支持 -P
标志:
$ grep -oP '(?<= - ).*(?= "GET /identity/ HTTP/1\.1)' access.log
BMC1 [06/Jul/2016:07:34:17 -0700]
RMC1 [06/Jul/2016:07:34:18 -0700]
RMC1 [06/Jul/2016:07:34:24 -0700]
如果去掉[
和]
很重要,我们可以使用:
$ grep -oP '(?<= - ).*(?=] "GET /identity/ HTTP/1\.1)' access.log | tr -d '['
BMC1 06/Jul/2016:07:34:17 -0700
RMC1 06/Jul/2016:07:34:18 -0700
RMC1 06/Jul/2016:07:34:24 -0700
我有一个要求,如果模式匹配,我需要从日志文件中 grep 多个字符串
下面是日志snapshot:access.log
12.12.137.16 - RMC1 [06/Jul/2016:07:34:17 -0700] "GET /identity/afr/partition/ie/n/default/opt/grid-11.1.1.9.0-5358.js HTTP/1.1" 200 9318
12.12.137.16 - BMC1 [06/Jul/2016:07:34:17 -0700] "GET /identity/ HTTP/1.1" 200 6788
12.12.137.16 - RMC1 [06/Jul/2016:07:34:17 -0700] "GET /identity/afr/partition/ie/n/default/opt/status-11.1.1.9.0-5358.js HTTP/1.1" 200 2297
12.12.137.16 - RMC1 [06/Jul/2016:07:34:17 -0700] "GET /identity/afr/partition/ie/n/default/opt/poll-11.1.1.9.0-5358.js HTTP/1.1" 200 2098
12.12.137.16 - RMC1 [06/Jul/2016:07:34:18 -0700] "GET /identity/afr/alta-v1/overflow_right_ena.png HTTP/1.1" 200 1082
12.12.137.16 - RMC1 [06/Jul/2016:07:34:18 -0700] "GET /identity/ HTTP/1.1" 200 6749
12.12.137.16 - RMC1 [06/Jul/2016:07:34:18 -0700] "GET /identity/afr/alta-v1/conv_l_ena.png HTTP/1.1" 200 1161
12.12.137.16 - RMC1 [06/Jul/2016:07:34:24 -0700] "GET /identity/ HTTP/1.1" 200 6799
12.12.137.16 - RMC1 [06/Jul/2016:07:34:27 -0700] "GET /identity/images/Dashboard/myAccess_s2.png HTTP/1.1" 200 6885
12.12.137.16 - SSS1 [06/Jul/2016:07:34:24 -0700] "POST /identity/faces/home?_adf.ctrl-state=o9l9q161v_5 HTTP/1.1" 200 41776
如果模式与日志文件中的 /identity /HTTP/1.1
匹配,则想要 grep 用户名和时间字段
所以我的输出将是:
BMC1 06/Jul/2016:07:34:17
RMC1 06/Jul/2016:07:34:18
RMC1 06/Jul/2016:07:34:24
尝试过:
grep -E '/identity/ HTTP/1.1' *.log
但它给出了整行。
请协助
使用 awk
$ awk -F'[][ ]+' '/\/identity\/ HTTP\/1[.]1/{print ,}' access.log
BMC1 06/Jul/2016:07:34:17
RMC1 06/Jul/2016:07:34:18
RMC1 06/Jul/2016:07:34:24
工作原理:
-F'[][ ]+'
这会将字段分隔符设置为
[
、]
或 space、 的任意组合
/\/identity\/ HTTP\/1[.]1/{print ,}
这将选择感兴趣的行并仅打印第三和第四个字段。
使用 sed
$ sed -n '\|/identity/ HTTP/1[.]1|{s/^.* - //; s/[[]//; s/[]].*//; p;}' access.log
BMC1 06/Jul/2016:07:34:17 -0700
RMC1 06/Jul/2016:07:34:18 -0700
RMC1 06/Jul/2016:07:34:24 -0700
工作原理:
-n
这告诉 sed 除非我们明确要求,否则不要打印任何东西。
\|/identity/ HTTP/1[.]1|
这将选择感兴趣的行。
s/^.* - //; s/[[]//; s/[]].*//
对于选定的行,这三个替换命令从行中删除不需要的部分。
p
这告诉 sed 在我们进行替换后打印所选行的剩余部分。
使用grep -P
如果你的 grep 支持 -P
标志:
$ grep -oP '(?<= - ).*(?= "GET /identity/ HTTP/1\.1)' access.log
BMC1 [06/Jul/2016:07:34:17 -0700]
RMC1 [06/Jul/2016:07:34:18 -0700]
RMC1 [06/Jul/2016:07:34:24 -0700]
如果去掉[
和]
很重要,我们可以使用:
$ grep -oP '(?<= - ).*(?=] "GET /identity/ HTTP/1\.1)' access.log | tr -d '['
BMC1 06/Jul/2016:07:34:17 -0700
RMC1 06/Jul/2016:07:34:18 -0700
RMC1 06/Jul/2016:07:34:24 -0700