Como imprimir linhas específicas de um arquivo de texto com corte

1

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.

    
por Mareyes 26.07.2018 / 06:00

3 respostas

0

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
    
por 26.07.2018 / 07:52
1

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.

    
por 09.08.2018 / 21:36
0

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

    
por 26.07.2018 / 09:46