如何提取部分日志文件 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.10
或 arcesium.com
我的印象是你的日志文件排列得很好,你的数字总是出现在字符 89 到 93 处,因此我建议 cut
而不是定界 awk
,如下所示:
cut -c 89-93 input_file
如果对齐并不总是那么好,也许一种基于 cut
和 awk
混合的方法可以完成这项工作。
我有一个日志文件,
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.10
或 arcesium.com
我的印象是你的日志文件排列得很好,你的数字总是出现在字符 89 到 93 处,因此我建议 cut
而不是定界 awk
,如下所示:
cut -c 89-93 input_file
如果对齐并不总是那么好,也许一种基于 cut
和 awk
混合的方法可以完成这项工作。