время задержки первой пятерки с файлом журнала со сценарием оболочки

На всякий случай, если у кого-то все еще есть проблема с Centos 7 на Raspberry Pi в связи с этой ошибкой LSB.

В конце концов я обнаружил, что запускаемый скрипт /etc/rc.d/init.d/network сразу же выдает ошибку с status = 6 , если конкретный файл не существует, а именно / etc / sysconfig / network .
Я понятия не имею, зачем нужен этот файл, поскольку в другой системе, над которой я работаю, файл существует, но пуст. Но его не существовало из коробки с ОС Centos 7, которую я получил для своего Raspberry. После выполнения всех остальных шагов (удаление Network Manager, установка статического IP-адреса в файле ifcfg, завершение процесса dhc для Network Manager и т. Д.), Если вы все еще получаете эту ошибку, просто попробуйте:

touch /etc/sysconfig/network

Файл может быть пустым. Просто должно существовать.

Затем перезапустите сетевую службу:

systemctl restart network

И вуаля. Я понимаю, что это очень небольшое исправление, но я прошел через все головные боли и попытки, описанные выше, прежде чем нашел это, и я был в порядке.

2
13.04.2017, 10:17
2 ответа

Вам понадобится несколько проходов. Вот решение, которое использует sed , sort , head и cut , чтобы вывести пятерку первых в нужном вам порядке.

sed -e 's/^\([A-Za-z]\{3\} \{1,2\}[0-9]\{1,2\} \{1,2\}\([0-9]\{2\}:\)\{2\}[0-9]\{2\}\).* \(delay=\([0-9]\{2\}\):\([0-9]\{2\}\):\([0-9]\{2\}\)\).*/\4\5\6 \1 \3/' | sort -nr | head -n5 | cut -d\  -f2-

С предоставленными вами входными данными это выдает:

Mar 19 06:10:26 delay=00:20:15
Mar 19 06:10:16 delay=00:00:15
Mar 19 14:41:26 delay=00:00:03

(Предполагается, что входные данные имеют формат журнала, который вы указали, и что это только переданные строки с нужными вам данными. Может потребоваться дополнительная команда grep в начале.)

Что он делает

Давайте разберемся.

sed

sed означает Stream EDitor. Обычно он используется для применения регулярных выражений к текстовым потокам.

Регулярное выражение sed

's/^\([A-Za-z]\{3\} \{1,2\}[0-9]\{1,2\} \{1,2\}\([0-9]\{2\}:\)\{2\}[0-9]\{2\}\).* \(delay=\([0-9]\{2\}\):\([0-9]\{2\}\):\([0-9]\{2\}\)\).*/\4\5\6 \1 \3/'

Это довольно сложно, но, скорее, должно быть, чтобы избежать катастрофического возврата .

Мы используем замены Regex. Чтобы увидеть, что он делает в деталях, попробуйте Regex101 . А пока знайте, что он принимает ввод:

Mar 19 06:10:16 ip-172-2-0-53 sendmail[28131]: v2JDA1k4028131: to=root, ctladdr=root (0/0), delay=00:00:15, xdelay=00:00:00, mailer=relay, pri=30580, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (v2JDAG5W028134 Message accepted for delivery)
Mar 19 14:41:26 ip-172-2-0-53 sendmail[29483]: v2JLfNFN029481: to=<jdoe@ifaded.com>,<ksmith@ifaded.com>, delay=00:00:03, xdelay=00:00:03, mailer=esmtp, pri=151738, relay=ifaded-com.mail.p...ction.outlook.com. [xx.xxx.x.x], dsn=2.0.0, stat=Sent (<4253fa32d79a11ce3b5f5147278dfae9@heg.jkadionbub.com> [InternalId=31288836753166, Hostname=FOOBAR1.namprd07.prod.outlook.com] 8924 bytes in 0.309, 28.142 KB/sec Queued mail for delivery)
Mar 19 06:10:26 ip-172-2-0-53 sendmail[28131]: v2JDA1k4028131: to=root, ctladdr=root (0/0), delay=00:20:15, xdelay=00:00:00, mailer=relay, pri=30580, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (v2JDAG5W028134 Message accepted for delivery)

и преобразует его в

000015 Mar 19 06:10:16 delay=00:00:15
000003 Mar 19 14:41:26 delay=00:00:03
002015 Mar 19 06:10:26 delay=00:20:15

sed regex match

^\([A-Za-z]\{3\} \{1,2\}[0-9]\{1,2\} \{1,2\}\([0-9]\{2\}:\)\{2\}[0-9]\{2\}\).* \(delay=\([0-9]\{2\}\):\([0-9]\{2\}\):\([0-9]\{2\}\)\).*

Сначала мы явно сопоставляем компоненты даты; они нам понадобятся для вывода позже. Затем мы по отдельности находим и сопоставляем задержку и ее временные компоненты; задержка, которую вы хотели в своем выводе. Компоненты времени, которые нам понадобятся позже для сортировки.

Замена регулярного выражения sed

\4\5\6 \1 \3

На стороне замены регулярного выражения мы берем взятые нами компоненты синхронизации и объединяем их без разделителя «:», который у них был изначально. Это важно, поскольку мы собираемся использовать их для sort позже. После компонентов синхронизации мы добавляем строку даты и всю исходную строку задержки; они нам понадобятся после сортировки.

sort

sort -nr

Поскольку наш ввод теперь начинается с десятичного числа вместо точной временной отметки, мы можем использовать числовой режим sort , указанный с помощью флага -n .

По умолчанию sort сортирует в порядке возрастания, при этом наибольшие значения помещаются в конец. Поскольку это будет означать обработку всех вывода sort для нахождения наибольших N значений, мы используем флаг sort -r , чтобы изменить порядок вывода; теперь наибольшие значения будут выводиться первыми, и мы можем head вместо `tail.

Наш вывод на этом этапе выглядит следующим образом:

002015 Mar 19 06:10:26 delay=00:20:15
000015 Mar 19 06:10:16 delay=00:00:15
000003 Mar 19 14:41:26 delay=00:00:03

head

head -n5

На этом этапе наш ввод будет иметь сначала самые большие значения, и мы уже знаем, что нам нужны самые большие 5 значений. Поэтому мы используем параметр head -n , чтобы сообщить head , сколько значений нам нужно.

Поскольку в этом примере у нас на самом деле не более 5 значений, мы все равно получаем весь вывод, который нам подали.

002015 Mar 19 06:10:26 delay=00:20:15
000015 Mar 19 06:10:16 delay=00:00:15
000003 Mar 19 14:41:26 delay=00:00:03

cut

cut -d\  -f2-

Поскольку он нам больше не нужен, мы нужно удалить числовой ключ сортировки, который мы вставили с помощью sed на первом шаге. Для этого мы обращаемся к cut , который позволяет нам выбирать, какие поля нам нужны из каждой предоставленной строки.

Мы используем параметр cut -d , чтобы сообщить ему, что такое наш разделитель полей, наш разделитель. Поскольку разделителем полей является пробел, нам нужно экранировать его с помощью \ , давая нам -d \ .

С точки зрения cut , это разбивает строку 002015 19 марта 06:10:26 delay = 00: 20: 15 на 002015 мар 19 06:10:26 delay = 00: 20: 15 .

Чтобы указать, какие поля нам нужны, мы используем -f . Поскольку нам нужны все поля, кроме первого, мы используем -f2- , что дает нам желаемый результат:

Mar 19 06:10:26 delay=00:20:15
Mar 19 06:10:16 delay=00:00:15
Mar 19 14:41:26 delay=00:00:03
2
27.01.2020, 22:10
perl -lane '
   print join $", /\sdelay=\K(\S+)(?=,)/, splice(@F, 0, 3), /\s\K(delay=\S+)(?=,)/;
' | sort -t: -k 1,1nr -k 2,2nr -k 3,3nr | cut -d\  -f2- | head -n 5
0
27.01.2020, 22:10

Теги

Похожие вопросы