Como cortar tudo até uma palavra específica / depois de um achado em um script

3

Estou tentando obter a saída de arquivos de hoje que contêm "ERROR" .

Eu uso isso para encontrar os arquivos que eu quero:

find /home/user/logfilesError/ -maxdepth 1 -type f -name "gandalf_*"\
   -daystart -mtime -1 -exec grep -rl "ERROR" "{}" +

Saída atual (se encontrado ERROR):

/home/user/logfilesError/gandalf_123.log

Mas a saída que quero é apenas o nome do arquivo de log:

gandalf_123.log

Informação: O caminho muda frequentemente, por isso não posso cortar as letras antes.

Obrigado pela sua ajuda!

    
por BlueFox 18.06.2014 / 10:57

4 respostas

2

A ferramenta basename pode remover o caminho antes do nome do arquivo.

find /home/user/logfilesError/ -maxdepth 1 -type f -name "gandalf_*"\
-daystart -mtime -1 -exec grep -rl "ERROR" "{}" + | xargs -n 1 basename

fornecerá a saída desejada.

-n 1 diz a xargs para usar exatamente um argumento para basename. Então, se ele receber mais, gerará um basename process por argumento. Isso é necessário, pois basename usa apenas um nome de arquivo como argumento.

Este comando NÃO irá funcionar se seus nomes de arquivos contiverem espaços. Neste caso, como sugerido por @HaukeLaging, use:

find /home/user/logfilesError/ -maxdepth 1 -type f -name "gandalf_*"\
-daystart -mtime -1 -exec grep -rl "ERROR" "{}" + | xargs -n 1 -d \n basename

Isso não funcionará se seus nomes de arquivos contiverem novas linhas, no entanto.

    
por 18.06.2014 / 11:07
1

Se ./gandalf_123.log estiver OK para você, então você pode usar

find /home/user/logfilesError/ -maxdepth 1 -type f -name "gandalf_*"\
  -daystart -mtime -1 -execdir grep -rl "ERROR" "{}" +

Caso contrário, enviaria a saída grep por meio de, por exemplo, sed para excluir a parte indesejada:

> echo /home/user/logfilesError/gandalf_123.log |
  sed 's+.*/++'
gandalf_123.log
    
por 18.06.2014 / 11:04
1

Você pode usar sed :

... | sed -e 's=.*/=='

Qual diz para substituir qualquer coisa até um / com nada.

Você também pode usar cut , mas não pode contar a partir da direita, então você precisa combiná-lo com rev :

... | rev | cut -d/ -f1 | rev
    
por 18.06.2014 / 11:04
0

isso pode ser feito com

 echo ${str##*/}

que cortará a string da esquerda para a direita até o último '/'

> str=/home/user/logfilesError/gandalf_123.log
> echo ${str##*/}
gandalf_123.log
    
por 19.06.2014 / 09:03