我希望可以有一些简单的方法来完成此操作,因为我是使用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等。
答案 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