grep primeiro n e últimos n caracteres de uma linha em um arquivo

5

Eu tenho um arquivo de log que se parece com:

Mar 23 08:20:23 New file got created in sec: 235
Mar 23 08:21:45 New file got created in sec: 127
Mar 23 08:22:34 New file got created in sec: 875
Mar 23 08:25:46 New file got created in sec: 322
Mar 23 08:26:12 New file got created in sec: 639

Eu preciso que a saída se pareça com:

Mar 23 08:20:23 : 235
Mar 23 08:21:45 : 127
Mar 23 08:22:34 : 875
Mar 23 08:25:46 : 322
Mar 23 08:26:12 : 639

O que eu posso fazer é apenas grep ou primeira parte ou a última parte da linha. Eu não sou capaz de colocar os dois juntos. Como posso obter a saída desejada da minha entrada?

    
por IAmAndroid 24.03.2017 / 04:42

7 respostas

9

você pode fazer algo assim

awk '{print $1,$2,$3,":",$NF}' logfile

espero que ajude.

    
por 24.03.2017 / 05:26
10

Você pode usar o corte como:

Comando:

cut --complement -c17-43 file1.txt

Saída:

Mar 23 08:20:23 : 235
Mar 23 08:21:45 : 127
Mar 23 08:22:34 : 875
Mar 23 08:25:46 : 322
Mar 23 08:26:12 : 639
    
por 24.03.2017 / 05:22
4

Você pode usar sed :

sed -r "s/^(.{15} ?).*(.{5})$//" logfile

Por sugestão, eu fiz o primeiro padrão acomodar dias de dígito único que não podem ser preenchidos com zeros, e use .* para o padrão do meio para ser mais flexível.

    
por 24.03.2017 / 04:54
3

No awk, é algo assim. Muito simples.

[zee@dev-instance temp]$ cat file1.txt 
Mar 23 08:20:23 New file got created in sec: 235
Mar 23 08:21:45 New file got created in sec: 127
Mar 23 08:22:34 New file got created in sec: 875
Mar 23 08:25:46 New file got created in sec: 322
Mar 23 08:26:12 New file got created in sec: 639
[zee@dev-instance temp]$ awk -F" " '{ print $1" "$2" "$3" : "$10 }'<file1.txt 
Mar 23 08:20:23 : 235
Mar 23 08:21:45 : 127
Mar 23 08:22:34 : 875
Mar 23 08:25:46 : 322
Mar 23 08:26:12 : 639
[zee@dev-instance temp]$ 
    
por 24.03.2017 / 05:20
2

Que tal isso:

sed -e 's/^\(.\{4\}\).*\(.\{4\}\)$/ /'

(Você pode descobrir o redirecionamento de E / S ou dar o nome do arquivo, etc. Veja o sed (1) para mais informações de invocação.)

Aqui, eu escolhi o número de caracteres para ser exatamente 4, mas você poderia substituir qualquer número (s) que você gosta. Note que o primeiro e último número de caracteres pode ser diferente:

sed -e 's/^\(.\{5\}\).*\(.\{2\}\)$/ /'

Isso retornaria os 5 primeiros caracteres e os 2 últimos caracteres de cada linha. Vou deixar para você descobrir como parametrizar isso ainda mais.

Além disso, observe que eu escolhi o sed (1) em vez do grep (1) (ou uma de suas variantes). Eu sei que isso pode não ser bem o que você quer como você pediu um regex grep, não um regex sed.

    
por 24.03.2017 / 10:10
2
perl -F '' -lane 'print @F[0..15, -5..-1]' yourfile

Explicação

-F '' = > dividir a linha em caracteres individuais, IOW, todos os campos são 1-char de espessura.

-l = > ORS=\n

-a = > @F array holds the fields, e.g., $F[15] => holds the 16-th character

-n = > don't print unless specifically asked to

@F[0..15, -5..-1] = > é uma fatia da matriz @F com os primeiros 16 caracteres e os últimos 5 caracteres, algo nos moldes de cut

    
por 24.03.2017 / 13:51
1

você pode fazer algo assim

cut -c1-15 logfile > file;

cut -c44- logfile > file1;

paste file file1 > logfilenew;

rm file file1;

cat logfilenew

a saída será armazenada no logfilenew.

    
por 24.03.2017 / 10:26