我想删除列的一部分(第七列:/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| {打印$7}'| awk -F/ '{print $3}' 但我不知道如何在第七列替换此请求,我可以在其中找到我的请求谢谢
答案1
sed 's,POST /[^/]*/,POST /,' logfile | awk ...
或者在 awk 脚本中如果使用默认字段分隔符 (FS)
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* 之前的空格。