スペースで定義されている列の一部(7番目の列:/user1/index...)を削除したいです。これは私のログファイルの例です。
192.xx.xxx - - [07/Apr/2017:14:21:15 +0200] "POST /user1/index.php?m=xxxxx&doajax=do_ajax_request&action=xxxx HTTP/1.1" ...
192.xx.x.xx - - [07/Apr/2017:14:21:15 +0200] "GET /user2/index.php?m=xxxxx&doajax=do_ajax_request&action=xxxxx HTTP/1.1"....
私はユーザー1とユーザー2も含めたすべてのユーザーを削除したいのですが、それはユーザーが何であるかに関係なく、リクエストを分析したいだけだからです。
192.xx.xxx - - [07/Apr/2017:14:21:15 +0200] "POST /index.php?m=xxxxx&doajax=do_ajax_request&action=xxxx HTTP/1.1" ...
192.xx.x.xx - - [07/Apr/2017:14:21:15 +0200] "POST /index.php?m=xxxxx&doajax=do_ajax_request&action=xxxxx HTTP/1.1"....
このコマンドを使用してリクエスト(/index.php?m=xxxx)を抽出しようとしましたが、cat /var/log/test.log| {print $7}'| awk -F/ '{print $3}'ですが、このリクエストを7番目の列に置き換える方法がわかりません。リクエストを見つける場所がわかりません。ありがとうございます。
答え1
sed 's,POST /[^/]*/,POST /,' logfile | awk ...
または、デフォルトのフィールドセパレータ(FS)を使用する場合はawkスクリプトで
sub ("POST /[^/]*/", "POST /", $7) ;
答え2
以下の sed オプションを試すことができます。
sed -i 's:/[a-zA-Z0-9]*/:/:2' logfile
ここでは、'/' で始まり、アルファベットと数字 (ユーザー名用) が含まれ、'/' で終わるパターンを検索し、ファイル内の各行を '/' だけに置き換えます。
または
sed -i 's: /[a-zA-Z0-9]*/:/:2' logfile
ここで、最初のコマンドとの唯一の違いは、行の最初の /user* の前にもスペースが取られることです。