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 basename
ferramenta 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 1
diz xargs
para usar exatamente um argumento para nome base. Portanto, se receber mais, gerará um basename
processo por argumento. Isto é necessário porque basename
leva 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.log
estiver 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 grep
saída, por exemplo, sed
para 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