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

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

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

Я использую это для поиска нужных мне файлов:

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

Текущий выход (если обнаружена ОШИБКА):

/home/user/logfilesError/gandalf_123.log

Но мне нужен только вывод имени файла журнала:

gandalf_123.log

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

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

решение1

Инструмент 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

Однако это не сработает, если имена файлов содержат символы новой строки.

решение2

Если ./gandalf_123.logвас это устраивает, то вы можете использовать

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

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

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

решение3

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

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

Что говорит ему заменить все до a /ничем.

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

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

решение4

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

 echo ${str##*/}

который обрежет строку слева направо до последнего символа '/'

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

Связанный контент