Usando o awk:
awk '/--/{flag=1; next} /====/{flag=0} flag' filename
Usando o SED:
sed -n '/--/,/===/{/--/!{/===/!p}}' filename
Usando o grep:
grep -E 'Product|Mathematica|MathKernel|Syntax' filename
Eu tenho o próximo fragmento da saída de um log:
Server Server: Server
Date and Time: June 04 2018 14:10:00
--
Product Version User Host IP Duration
Software1 11.0 user user *.**.***.*** 10:08
Software2 11.0 user user *.**.***.*** 10:05
===================================================================================
Eu quero com o comando cut apenas filtrar para a saída como:
Product Version Host IP Duration
Software1 11.0 user *.**.***.*** 10:08
Software2 11.0 user *.**.***.*** 10:05
Além disso, eu quero saber se é possível aplicar o mesmo filtro várias vezes, porque no primeiro exemplo acima, ele se repete no arquivo inteiro.
Você não pode usar cut
neste caso, pois as colunas dos dados não estão claramente definidas. O utilitário cut
funciona cortando em números exatos, por ex. exatamente em 3 espaços ou tabulações ou qualquer outro delimitador que você tenha. Nesse caso, você precisará usar awk
, que divide suas linhas de entrada em qualquer número de espaços em branco consecutivos (por padrão).
$ awk -v OFS="\t" '/^==/ { next } NR > 4 { print $1, $2, $4, $5, $6 }' file | column -t
Product Version Host IP Duration
Software1 11.0 user *.**.***.*** 10:08
Software2 11.0 user *.**.***.*** 10:05
O programa awk
ignora qualquer linha que comece com ==
e qualquer linha antes da quinta linha. Para todas as outras linhas, imprime uma seleção dos campos (não o 3º, User
).
O column -t
no final formata o resultado em uma boa tabela.
Eu encontrei a solução mais simples para isso:
awk '{print $1,$2,$4,$5,$6}' file1.log > file2.log
Isso permite apenas imprimir minhas colunas preferidas
Product Version Host IP Duration
Software1 11.0 User *.**.***.*** 10:08
Software2 11.0 User *.**.***.*** 10:05
Eu não percebi o uso importante de awk
Tags grep text-processing linux cut