Все еще на уровне новичка!
Пример одной строки в моем file.txt
:
158.45.456.756 - - [04/Feb/2016:10:51:24 -0500] "GET /tiles/1.0.0/cd/base/1/85/785.png?wb75678545=75D2503E HTTP/1.1" 200 8848 "http://site/map.html" "Mozilla/5.0 (Windows NT 6.1; MOM64; Trident/7.0; mv:10.0) like Blah"
Результат я хочу выполнить:
[04/Feb/2016:10:51:24-0500]/tiles/1.0.0/cd/base/1/85/7852008848
Что я попробовал до сих пор
awk '{ print $4 $5 $7 $9 $10}'
возвратится:
[04/Feb/2016:10:51:24-0500]/tiles/1.0.0/cd/base/1/85/785.png?wb75678545=75D2503E2008848
который не хорош потому что эта часть .png?wb75678545=75D2503E
не должен содержаться в строке.
Я также пытался просто печатать 7-й столбец, и удалите все после последней точки с awk '{ print $7}' | grep -Po '.*(?=\.)'
который возвратил меня результат, который я хочу для определенного столбца:
/tiles/1.0.0/cd/base/1/85/785
однако я заканчиваю тем, что был не учтен с другой частью строки.
Вопрос
Как я могу распечатать все столбцы, в которых я нуждаюсь и в то же время или перед редактированием просто 7-й столбец?
С awk
:
awk '{print $4 $5 gensub("(.*/[^.]+)\\..*", "\\1", 1, $7) $9 $10}'
print
печатает обязательные поля без любой модификации, только с необходимой частью 7-го поля, извлекаемого с gensub()
В gensub("(.*/[^.]+)\\..*", "\\1", 1, $7)
, шаблон Regex "(.*/[^.]+)\\..*"
соответствует части до .
после в последний раз /
, и помещенный это в полученную группу 1
, и затем остальные как соответствия \\..*
. В замене только полученная группа используется для получения той части только
В шаблоне Regex (.*/[^.]+)\\..*
, часть в полученной группе ()
т.е. в .*/[^.]+
, .*/
соответствия жадно до последнего /
, затем [^.]+
соответствует части до следующего .
, это сохранено как полученная группа 1, поскольку это - наша желаемая часть, и мы будем использовать группу в замене, затем \\.
соответствует литералу .
, затем .*
остальная часть соответствий строки
Из комментария, если Вы хотите сохранить .
в соответствии т.е. хотят .
также:
awk '{print $4 $5 gensub("(.*/[^.]+\\.).*", "\\1", 1, $7) $9 $10}'
Пример:
% awk '{print $4 $5 gensub("(.*/[^.]+)\\..*", "\\1", 1, $7) $9 $10}' <<<'158.45.456.756 - - [04/Feb/2016:10:51:24 -0500] "GET /tiles/1.0.0/cd/base/1/85/785.png?wb75678545=75D2503E HTTP/1.1" 200 8848 "http://site/map.html" "Mozilla/5.0 (Windows NT 6.1; MOM64; Trident/7.0; mv:10.0) like Blah"'
[04/Feb/2016:10:51:24-0500]/tiles/1.0.0/cd/base/1/85/7852008848
% awk '{print $4 $5 gensub("(.*/[^.]+\\.).*", "\\1", 1, $7) $9 $10}' <<<'158.45.456.756 - - [04/Feb/2016:10:51:24 -0500] "GET /tiles/1.0.0/cd/base/1/85/785.png?wb75678545=75D2503E HTTP/1.1" 200 8848 "http://site/map.html" "Mozilla/5.0 (Windows NT 6.1; MOM64; Trident/7.0; mv:10.0) like Blah"'
[04/Feb/2016:10:51:24-0500]/tiles/1.0.0/cd/base/1/85/785.2008848