I есть файл, который состоит из таких строк:
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 ... и т. д.)?
По крайней мере, с этими данными(*):
С помощью 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, но я не могу вспомнить все варианты точного формата, поэтому я могу делать предположения.)