Как вырезать все до определенного слова / после поиска в скрипте

Я пытаюсь получить выходные файлы с сегодняшнего дня, которые содержат "ERROR" .

Я использую это, чтобы найти файлы, которые я хочу:

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

Токовый выход (если найден ERROR):

 /home/user/logfilesError/gandalf_123.log 

Но я хочу получить только имя файла журнала:

 gandalf_123.log 

Информация: путь изменяется часто, поэтому я не могу просто перерезать буквы раньше.

Спасибо за вашу помощь!

Инструмент basename может удалить путь до имени файла.

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

даст вам желаемый результат.

-n 1 говорит xargs использовать только один аргумент для basename. Поэтому, если он получит больше, он будет генерировать один basename процесс для каждого аргумента. Это необходимо, так как basename принимает только одно имя файла в качестве аргумента.

Эта команда НЕ будет работать, если ваши имена файлов содержат пробелы. В этом случае, как было предложено @HaukeLaging, используйте:

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

Это не будет работать, если ваши имена файлов содержат символы новой строки.

Если ./gandalf_123.log подходит для вас, вы можете использовать

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

В противном случае я бы grep вывод grep через eg sed , чтобы удалить ненужную часть:

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

Вы можете использовать sed :

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

Что говорит ему заменить что-либо до / ничего.

Вы также можете использовать cut , но он не может считаться справа, поэтому вам нужно совместить его с rev :

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

это можно сделать с помощью

  echo ${str##*/} 

который будет обрезать строку слева направо до последнего '/'

 > str=/home/user/logfilesError/gandalf_123.log > echo ${str##*/} gandalf_123.log