você pode fazer algo assim
awk '{print $1,$2,$3,":",$NF}' logfile
espero que ajude.
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?
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
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.
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]$
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.
perl -F '' -lane 'print @F[0..15, -5..-1]' yourfile
-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
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.
Tags grep text-processing awk sed cut