#linux #bash #shell #unix
#linux #bash #оболочка #unix
Вопрос:
У меня есть строка / файл, который содержит некоторые данные, которые необходимо отправить по почте с помощью API. Но это не позволяет длине сообщения превышать N.
Итак, теперь я хочу обрезать содержимое файла до N символов.
Предположим, что содержимое файла выглядит так, как показано ниже:
2020-09-28 03:13:41,288 ERROR [.] [main]: java.lang.NullPointerException java.lang.NullPointerException
2020-09-28 03:13:41,298 ERROR [.] [main]: java.lang.NullPointerException java.lang.NullPointerException
at com.myPackage.anotherPackage.DoSomething.processSomeData(MagicallyPullData.java:98)
at com.myPackage.anotherPackage.DoSomething.processSomeData(MagicallyPullData.java:56)
at com.myPackage.anotherPackage.DoSomething.processSomeData(MagicallyPullData.java:112)
Я хочу получить 50 символов для сегодняшней даты, скажем
[main]: java.lang.NullPointerException java.lang.NullPointerException
Таким образом, шаблон сегодняшней даты должен совпадать, но дата не должна включаться, после этого вся строка должна быть сокращена до 50 символов.
Я написал следующее
cat /home/myproject/logs/errors.log | grep "`date --date='today' ' %Y-%m-%d'`"
Но это дает все строки с сегодняшней датой.
Этот скрипт будет заданием cron, которое выполняется каждый день.
Комментарии:
1. Добро пожаловать в StackOverflow! Подразумевается нечто большее, чем просто «50 символов на сегодняшнюю дату». Вам нужна только первая строка, первая совпадающая строка, первые 50 символов после даты, которые совпадают в каждой строке? Пожалуйста, будьте более конкретны. Вы можете использовать
sed s/<regex>//
, чтобы удалить начальную дату из совпадающих строк иhead -c 50
получить только первые 50 символов.2. Извините за мой плохой английский. Для первой строки, которая соответствует сегодняшней дате, 50 символов, начинающихся после времени.
Ответ №1:
Удалите дату с помощью cut -d' ' -f2-
, затем передайте ее, head -c50
чтобы получить первые 50 байт:
grep "`date --date='today' ' %Y-%m-%d'`" /home/myproject/logs/errors.log | cut -d' ' -f2- | head -c50
Комментарии:
1. Это также выполняет мою работу, но тот, который я пометил как ответ, лучше подходит для моего требования. Спасибо, что нашли время и ответили на мой запрос.
Ответ №2:
В качестве альтернативы grep
cut
рассмотрим Awk .
awk -v ddmmyy="$(date %Y-%m-%d)" '$1 == ddmmyy {
print substr($0, 1, 50) }' /home/myproject/logs/errors.log
Если вам нужны только первые 50 символов с первого вхождения на сегодняшнюю дату, просто добавьте ; exit
после закрывающей круглой скобки перед закрывающей фигурной скобкой.
Если вам нужен только текст с позиции 35 символов вперед, измените второй аргумент на substr
from 1
to 35
.