Text-Processing

從日誌文件中獲取特定資訊

  • April 27, 2017

我想從我的日誌文件中獲取一些部分,我試圖削減請求部分以獲取使用者、模組、操作、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

引用自:https://unix.stackexchange.com/questions/361448