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