Text-Processing
從日誌文件中獲取特定資訊
我想從我的日誌文件中獲取一些部分,我試圖削減請求部分以獲取使用者、模組、操作、doAjax 和 ajaxAction
例如,我有
195.xx.x.x - - [25/Apr/2017:09:60:xx +0200] "POST /userx/index.php?m=contacts&a=form&... 192.xx.x.x - - [25/Apr/2017:09:45:xx +0200] "POST /usery/index.php?m=customer&doajax=request&action=getContacts... 197.xx.x.x - - [25/Apr/2017:09:20:xx +0200] "GET /userx/index.php?m=meeting&doajax=date&id=3
我想擁有:
[user]|[module]|[action]|[doAjax]|[ajaxAction] usery contacts form null null userx customer null request getContacts userz meeting null date null
在哪裡:
userx --> user m=xxx -->module a=xxx -->action doajax=xxx-->doAjax action=xxx-->ajaxAction
我嘗試使用
awk
, set 但僅剪切第 7 列,在該列中我可以使用以下命令找到我的請求:awk '{printf $7; next ; }' logfile
那麼在列印我的請求之後,我該如何提取使用者、模組、操作、doAjax 和 ajaxAction 呢?
perl“單線”:
$ perl -lne ' BEGIN{ printf "%-10s%-10s%-10s%-10s%-15s\n", qw([user] [module] [action] [doAjax] [ajaxAction]); } $usr = $mde = $act = $doAj = $ajAc = "null"; $usr=$1 if m|\s/([^/]+)/|; $mde=$1 if /m=(.+?)(&|$)/; $act=$1 if /a=(.+?)(&|$)/; $doAj=$1 if /doajax=(.+?)(&|$)/; $ajAc=$1 if /action=(.+?)(&|$)/; printf "%-10s%-10s%-10s%-10s%-15s\n", ($usr,$mde,$act,$doAj,$ajAc)' file [user] [module] [action] [doAjax] [ajaxAction] userx contacts form null null usery customer null request getContacts userx meeting null date null
這裡的基本技巧是搜尋標識 URL 部分的每個字元串,如果找到,則為其設置相應的變數。在每種情況下,我們都會查找標識符後跟
=
(例如m=
),然後是 a&
或行尾(&|$)
。因為匹配的部分放在括號中(例如m=(.+?)
),所以我們可以將其稱為$2
和,這就是保存在每個變數中的內容。如果您確實需要
|
作為分隔符,並且不反對它會使輸出的可讀性降低這一事實,您可以使用它來代替:$ perl -lne ' BEGIN{ printf "%s|%s|%s|%s|%s\n", qw([user] [module] [action] [doAjax] [ajaxAction]); } $usr = $mde = $act = $doAj = $ajAc = "null"; $usr=$1 if m|\s/([^/]+)/|; $mde=$1 if /m=(.+?)(&|$)/; $act=$1 if /a=(.+?)(&|$)/; $doAj=$1 if /doajax=(.+?)(&|$)/; $ajAc=$1 if /action=(.+?)(&|$)/; print join "|", ($usr,$mde,$act,$doAj,$ajAc)' file [user]|[module]|[action]|[doAjax]|[ajaxAction] userx|contacts|form|null|null usery|customer|null|request|getContacts userx|meeting|null|date|null
更好的(更易讀的輸出)方法是使用
printf
: