Вырезать строку после определенного количества символов в оболочке Unix

#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 .