awk-如何在空格分隔的日志文件中提取带引号的字符串

时间:2019-03-08 00:29:20

标签: awk

我希望可以有一些简单的方法来完成此操作,因为我是使用awk的新手。

我有一堆来自AWS负载均衡器的日志文件,我想从这些日志中提取条目,并在其中接收到特定的响应代码。

检查响应代码非常容易,我可以执行以下操作...

$9=="403" {print $0}

但是,我真正想要的只是请求本身,$ 13,但是此栏被引用,并且将包含空格。看起来像这样...

"GET https://[my domain name]:443/[my path] HTTP/2.0"

如果我执行以下操作...

$9=="403" {print $13}

我刚得到...

"GET

所以我认为我需要做的是awk(或其他适当的实用程序)提取完整的第13列,然后将其分解为各个字段,例如方法,URL等。

2 个答案:

答案 0 :(得分:0)

能否请您尝试以下。我已经根据您的示例给出了match 443的正则表达式以匹配它,您也可以根据需要将其替换为403并将其更改为match($0,/\".*403.*\"/)

awk 'match($0,/\".*443.*\"/){print substr($0,RSTART,RLENGTH)}'  Input_file

此方法的恕我直言,优点是您无需对awk中的任何字段号进行硬编码。还有1件事,我假设您的Input_file仅具有"......403....."种类型的部分,而您只想打印该部分。

我假设您可能再出现awk的地方多了"..."个,所以只选择一个403|443来的地方。

awk 'match($0,/\".*443[^"]*/){print substr($0,RSTART,RLENGTH+1)}' Input_file


编辑: 或者如果您的Input_file有"...443..."次,或者此文本在行开始之后排在第一位(假设其他{{1 }}稍后再发布),然后您可以尝试关注。

".."

答案 1 :(得分:0)

较新版本gawk具有内置变量FPAT,您可以使用该变量通过正则表达式模式定义字段。对于您的日志,如果在字段9和13之前没有其他带引号的字段:

awk -v FPAT='[^[:space:]]+|"[^"]*"' '$9 == "403"{print $13}' log_file

REF:https://www.gnu.org/software/gawk/manual/html_node/Splitting-By-Content.html