Использование GNU awk
дляFPAT
и при условии отсутствия внутренних двойных кавычек внутри двойных -кавычек или квадратных скобок внутри скобок:
awk -v FPAT='"[^"]*"|\\[[^]]*\\]|[^ ]*' '{ for(i=1; i<=NF; i++) print $i }' infile
Регексы фактически совпадают с char-X[not char-X]<zero-or-more-of-any-character-until>char-X
.
см. в man awk
FPAT
A regular expression describing the contents of the fields in a record. When set, gawk parses the input into fields, where the fields match the regular expression, instead of using the value of FS as the field separator.
Сначала добавьте двойные кавычки вокруг бита даты (1 ). Это дает вам действительный файл CSV с пробелами в качестве разделителей вместо запятых. Затем используйте анализатор CSV, чтобы прочитать строку как запись CSV, используя пробел в качестве разделителя полей (2 ). Выведите запись с разделителем, установленным на новую строку (3 ). Сделанный.
sed 's/\[/"&/; s/\]/&"/'
cvsformat -H -d ' '
(-H
не читать строку заголовка с заголовками столбцов)csvformat -H -D $'\n'
(для $'...'
требуется оболочка, которая понимает «С-строки», например bash
, в противном случае используйте буквальный перевод строки)2-й и 3-й шаги можно комбинировать, что даст вам
sed 's/\[/"&/; s/\]/&"/' logfile | csvformat -H -d ' ' -D $'\n'
С учетом данных в logfile
это дает
www.example.com:443
1.2.3.4
-
-
[01/Feb/2021:15:07:35 +0100]
GET /index.html HTTP/1.1
200
8317
https://www.example.com/
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36
Двойные кавычки удалены из некоторых записей, так как они больше не нужны.
csvformat
является частью csvkit .