Grep uma string do arquivo

1

Eu tenho 5 nomes de arquivos criados dentro de uma pasta para uma operação.Os nomes dos arquivos estão no seguinte formato.

ES_currentdate_currenttime_processid_uniqueid.log

Eu quero ler o status do último arquivo criado nesse caminho.

A maneira como eu formo o nome do arquivo no shell script é:

$ filename=ES_*_uniqueid.log
$ echo grep "##status##XRB##" $HOME/log/$filename | sort -u' "

Quando eu grep , ele lê o status de todos os 5 arquivos e os ecoa. Eu quero que a string seja grep apenas do arquivo mais recente que foi criado.

Alguém poderia fornecer uma solução?

    
por suni 08.08.2013 / 08:38

2 respostas

2

Desde que os arquivos tenham sido escritos em ordem cronológica, os nomes dos arquivos realmente não importam. Basta usar tail -1 para obter o último arquivo em uma listagem dos arquivos e esse deve ser sempre o arquivo mais recente:

$ filename=ES_*_uniqueid.log
$ grep "##status##XRB##" $(ls -tr $filename | tail -1)

Isso executará o subcomando ls -tr $filename | tail -1 , que retornará um único resultado, o arquivo mais recente. Este arquivo será então usado para strings correspondentes a ##status##XRB## .

    
por 08.08.2013 / 09:34
0

Em zsh ( explicações :

grep "##status##XRB##" ~/log/ES_*.log(om[1])

Se as datas estiverem em um formato sensível (YYYYmmdd_HHMMSS), a ordem lexicográfica nos nomes dos arquivos corresponderá à ordem cronológica. Então, em ksh ou bash, você pode colocar os nomes dos arquivos correspondentes em uma matriz: o arquivo que você está procurando será o último elemento da matriz.

logs=(~/log/ES_*.log)
grep "##status##XRB##" "${logs[${#logs}-1]}"

Com apenas um shell POSIX (por exemplo, /bin/sh ), você pode usar os parâmetros posicionais.

grep_last_match () {
  eval set -- \"\${$#}\"
  grep "##status##XRB##" "$1"
}
grep_last_match ~/logs/ES_*.log
    
por 09.08.2013 / 02:54