Como cortar tudo até uma palavra específica/após um achado em um script

Como cortar tudo até uma palavra específica/após um achado em um script

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

Eu uso isso para encontrar os arquivos que desejo:

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

Saída atual (se ERRO for encontrado):

/home/user/logfilesError/gandalf_123.log

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

gandalf_123.log

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

Obrigado pela ajuda!

Responder1

A basenameferramenta 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

lhe dará a saída desejada.

-n 1diz xargspara usar exatamente um argumento para nome base. Portanto, se receber mais, gerará um basenameprocesso por argumento. Isto é necessário porque basenameleva apenas um nome de arquivo como argumento.

Este comando NÃO funcionará se seus nomes de arquivos contiverem espaços. Neste caso, conforme 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

Porém, isso não funcionará se seus nomes de arquivos contiverem novas linhas.

Responder2

Se ./gandalf_123.logestiver tudo bem para você, você pode usar

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

Caso contrário, eu canalizaria a grepsaída, por exemplo, sedpara excluir a parte indesejada:

> echo /home/user/logfilesError/gandalf_123.log |
  sed 's+.*/++'
gandalf_123.log

Responder3

Você pode usar sed:

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

O que diz para substituir qualquer coisa até a /por nada.

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

... | rev | cut -d/ -f1 | rev

Responder4

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

informação relacionada