使用正则表达式从行中提取某些部分

使用正则表达式从行中提取某些部分

我的文件包含以下行:

50.57.61.8 - - [04/Apr/2019:09:52:01 -0400] "GET /tracker.php?q=1&p=2 HTTP/1.1" 302 20 "-" "Rackspace Monitoring/1.1 (https://monitoring.api.rackspacecloud.com)"
50.57.61.9 - - [04/Apr/2019:09:52:01 -0400] "GET /tracker.php?q=1&p=2 HTTP/1.1" 302 20 "-" "Rackspace Monitoring/1.1 (https://monitoring.api.rackspacecloud.com)"

现在我想得到如下输出:

50.57.61.8 - - [04/Apr/2019:09:52:01 -0400] "GET /tracker.php?q=1&p=2 HTTP/1.1" 
50.57.61.9 - - [04/Apr/2019:09:52:01 -0400] "GET /tracker.php?q=1&p=2 HTTP/1.1"

我们如何使用 Linux 命令(grep/cut ...等)来实现这一点?

答案1

至少对于该特定数据(*)

使用cut,取前八个空格分隔的字段:

$ cut -d' ' -f1-8 < someinputfile 
50.57.61.8 - - [04/Apr/2019:09:52:01 -0400] "GET /tracker.php?q=1&p=2 HTTP/1.1"
50.57.61.9 - - [04/Apr/2019:09:52:01 -0400] "GET /tracker.php?q=1&p=2 HTTP/1.1"

使用sed,使用s///和 正则表达式删除第一个双引号,后跟一个空格,以及其后的所有内容(并将引号放回去):

$ sed -e 's/" .*/"/' < someinputfile 
50.57.61.8 - - [04/Apr/2019:09:52:01 -0400] "GET /tracker.php?q=1&p=2 HTTP/1.1"
50.57.61.9 - - [04/Apr/2019:09:52:01 -0400] "GET /tracker.php?q=1&p=2 HTTP/1.1"

(* 也就是说,这看起来像 Apache 的日志文件,但我不记得确切格式的所有变体,所以我可能会做出假设。)

相关内容