Как распечатать столбцы с awk, и в то же время редактируют всего один столбец?

Все еще на уровне новичка!

Пример одной строки в моем 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-й столбец?

1
задан 7 October 2016 в 21:49

1 ответ

С 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
2
ответ дан 7 December 2019 в 13:41

Другие вопросы по тегам:

Похожие вопросы: