Я пытаюсь получить вывод файлов за сегодняшний день, которые содержат "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