Como extrair um valor particular do arquivo de log e transferi-lo para outro arquivo

0

Eu tenho um arquivo de log que se parece com:

########### mv90_poll.sh started Wed Sep 23 02:36:00 PDT 2015 ############

/usr/mv90/mv90/system/*.di not found
list *.HHF files in /usr/mv90/fats
-rw-------   1 cdas       cdas             6 Jan 12  2015 MO994001.HHF
-rw-------   1 cdas       cdas        189440 Jan 12  2015 MO994002.HHF
-rw-rw-r--   1 samalrr    cdas         12800 Sep 22 13:30 TU994001.HHF

Eu quero saber como escrever um script que extraia todos os arquivos .HHF em outro arquivo, pode estar no formato excel.

    
por Pooja 23.09.2015 / 22:23

3 respostas

4

Use grep :

grep -oP '[A-Z]{2}[0-9]{6}\.HHF$' file >newfile

Suponho que esses arquivos .HHF tenham um nome começando com 2 caracteres maiúsculos ( [A-z{2}] ) e depois 6 dígitos ( [0-9]{6} ), seguidos por .HHF .

O sinalizador -o força grep a imprimir apenas a parte correspondente do padrão, em vez da linha inteira. -P ativa expressões regulares compatíveis com Perl.

    
por 23.09.2015 / 22:30
1

Outro exemplo de um comando grep para fazer o mesmo:

$ grep -oE '[[:upper:]]{2}[[:digit:]]{8}\.HHF' the_log_file.log > hhf_list.txt

hhf_list.txt:

$ cat hhf_list.txt
MO994001.HHF
MO994002.HHF
TU994001.HHF

Como funciona

  • -o mostra apenas o texto correspondente como @chaos mencionado
  • -E usa expressões regulares estendidas, portanto, você pode digitar { e } (chaves) sem escapá-las, o grep padrão exigiria gravação \{ e \} para o mesmo efeito
  • Eu prefiro o estilo POSIX [[:upper:]] [[:digit:]] para fazer com que ele se destaque mais, o que está sendo correspondido e as contagens {2} e {6}
  • nome do arquivo com a extensão .txt opcional, mas ajuda a lembrar que esse é um arquivo de texto, possivelmente mais tarde, se você usar o Excel em uma máquina com Windows, pode ser útil
por 23.09.2015 / 23:13
0

Se você gostaria de fazer um procedimento regex semelhante no sed:

sed -n 's/.* \([^\s]\{2,\}\.HHF\)//p' log.txt > files.txt

O comportamento padrão do sed é imprimir cada linha no arquivo que você forneceu (neste caso, log.txt). A bandeira -n desativa esse comportamento. O comando s/REGEXPATTERN/REPLACEMENT/ encontrará linhas com uma substring correspondente a REGEXPATTERN e substituirá por REPLACEMENT . Um exemplo de um comando auxiliar no sed para fazer substituições extravagantes é o comando \# , em que # é um inteiro, que substitui a subseqüência da linha correspondente à parte # -th do REGEXPATTERN entre parênteses, começando com 1. Neste caso, ele substituirá a linha inteira apenas pela parte da linha que possui pelo menos dois caracteres que não são espaços em branco seguidos por .HHF . Finalmente, o comando p imprime a linha modificada resultante, neste caso apenas o nome do arquivo. Em seguida, canalizamos a saída com > para um arquivo de texto que terá todo o seu nome de arquivo armazenado, um por linha. Este comando sed supõe que seus arquivos tenham pelo menos dois caracteres antes da terminação .HHF, e assume que os nomes dos arquivos serão precedidos por pelo menos um espaço.

    
por 23.09.2015 / 23:17