Você pode fazer isso com um único comando sed. Primeiro, como estratégia geral, para extrair uma parte de uma linha em sed, use o comando s
, com uma expressão regular que corresponde à linha inteira (começando com ^
e terminando com $
), com o parte a reter em um grupo ( \(…\)
), substituindo toda a linha pelo conteúdo do (s) grupo (s) a manter. Passe a opção -n
para desativar a impressão padrão e coloque o modificador p
para imprimir linhas onde há algo para extrair. Você pode restringir ainda mais a extração prefixando o comando com um regex que deve corresponder à linha.
sed -n '/view external.*denied/ s/^.* client \([0-9.][0-9.]*\)#.*//p'
Se você preferir usar o awk, você pode usar sua função sub
para remover uma parte de uma string.
grep -E 'view external.*denied' /var/log/messages |
awk '{sub(/#.*/, "", $7); print $7}'
Você também pode usar a função index
para localizar a função #
e substr
para extrair a parte que deseja manter.
grep -E 'view external.*denied' /var/log/messages |
awk '{print substr($7, 1, index($7, "#"))}'
Você pode combinar facilmente o comando grep no comando awk.
</var/log/messages awk '/view external.*denied/ {sub(/#.*/, "", $7); print $7}'