如何提取部分日志文件 bash

how to extract part of log file bash

我有一个日志文件,

10.1.1.10 arcesium.com [17/Dec/2018:08:05:32 +0000] "GET /api/v1/services HTTP/1.1" 200 4081 "http://www. example.com/" "Mozilla/5.0 (X11; Linux x86_64; rv:25.0) Gecko/20100101 Firefox/25.0"
10.1.1.11 arcesium.com [17/Dec/2018:08:05:32 +0000] "GET /api/v1/services HTTP/1.1" 200 4084 "http://www. example.com/" "Mozilla/5.0 (X11; Linux x86_64; rv:25.0) Gecko/20100101 Firefox/25.0"
10.1.1.13 arcesium.com [17/Dec/2018:08:05:32 +0000] "GET /api/v1/services HTTP/1.1" 200 4082 "http://www. example.com/" "Mozilla/5.0 (X11; Linux x86_64; rv:25.0) Gecko/20100101 Firefox/25.0"

我想获取第 9 个字段,

awk '{print }' file.txt
4081
4084
4082

但问题是,如果第3列多了一个space "[17/Dec/2018:08:05:32 +0000]",那么我的值位置将变为第10列。

如何实现合并单值字段而不考虑它们之间的 space。

我想用 awk 来实现。

使用awk

$ awk -F"\"" '{=substr(,6,4);print }' input_file
4081
4084
4082

您可以在 gnu-awk FPAT 中使用,splitting by content

awk 'BEGIN{FPAT = "(\"[^\"]+\")|(\[[^\]]+\])|([^ ]+)" } {print }' file.txt

你明白了,

4081
4084
4082

对于第 1 列,

awk 'BEGIN{FPAT = "(\"[^\"]+\")|(\[[^\]]+\])|([^ ]+)" } {print }' file.txt

你明白了,

10.1.1.10
10.1.1.11
10.1.1.13

例如第 3 列

awk 'BEGIN{FPAT = "(\"[^\"]+\")|(\[[^\]]+\])|([^ ]+)" } {print }' file.txt

你明白了,

[17/Dec/2018:08:05:32 +0000]
[17/Dec/2018:08:05:32 +0000]
[17/Dec/2018:08:05:32 +0000]

例如第 4 列

awk 'BEGIN{FPAT = "(\"[^\"]+\")|(\[[^\]]+\])|([^ ]+)" } {print }' file.txt

你明白了,

"GET /api/v1/services HTTP/1.1"
"GET /api/v1/services HTTP/1.1"
"GET /api/v1/services HTTP/1.1"

正则表达式解释

  • 第一个备选方案(\"[^\"]+\")

"开始并以"结束的匹配记录,例如。 "GET /api/v1/services HTTP/1.1"

  • 第二选择(\[[^\]]+\])。注意awk中\[\]是必须的

[开始并以]结束的匹配记录,例如。 [17/Dec/2018:08:05:32 +0000]

  • 第三选择([^ ]+)

与整个单词匹配,例如。 10.1.1.10arcesium.com

我的印象是你的日志文件排列得很好,你的数字总是出现在字符 89 到 93 处,因此我建议 cut 而不是定界 awk,如下所示:

cut -c 89-93 input_file

如果对齐并不总是那么好,也许一种基于 cutawk 混合的方法可以完成这项工作。