ログファイルから特定の情報を取得する

ログファイルから特定の情報を取得する

ログファイルからいくつかの部分をインポートしたいと思います。ユーザー、モジュール、アクション、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  

、setを試してみましたawkが、次のようにして要求を見つけることができる7番目の列だけを切り捨てようとしました。

awk '{printf $7; next ; }' logfile

では、リクエストを印刷した後、ユーザー、モジュール、アクション、doAjax、ajaxActionをどのように抽出しますか?

ベストアンサー1

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=)、または&行末を探します(&|$)。一致する部分を括弧内に入れるので(たとえば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

おすすめ記事