com awk
:
awk '{print gensub("(.*/[^.]+)\..*", "\1", 1, ) }'
-
print
imprime os campos obrigatórios sem qualquer modificação, com apenas a parte obrigatória do sétimo campo sendo extraída comgensub()
-
Em
gensub("(.*/[^.]+)\..*", "\1", 1, )
, o padrão Regex"(.*/[^.]+)\..*"
corresponde à parte anterior ao.
após o último/
e coloca isso no grupo capturado1
e, em seguida, o restante como correspondências por% código%. Na substituição apenas o grupo capturado é usado para obter apenas essa parte -
No padrão Regex
\..*
, a parte dentro do grupo capturado(.*/[^.]+)\..*
, ou seja, em()
,.*/[^.]+
corresponde com avidez até o último.*/
, então/
corresponde à parte até o próximo[^.]+
, isso é mantido como grupo capturado 1, já que essa é a parte desejada, e usaremos o grupo em substituição, então.
corresponde a um literal\.
, então.
corresponde ao restante da string
Do comentário, se você quiser manter .*
dentro da correspondência, ou seja, .
também:
awk '{print gensub("(.*/[^.]+\.).*", "\1", 1, ) }'
Exemplo:
% awk '{print gensub("(.*/[^.]+)\..*", "\1", 1, ) }' <<<'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 gensub("(.*/[^.]+\.).*", "\1", 1, ) }' <<<'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