スペースで定義された列(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"....
すべてのユーザーを削除したいです。これはuser1とuser2を意味します。これは、ユーザーに関係のない要求を分析したいからです。
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 *の前のスペースも占めることです。