В syslog или rsyslog кольцевой буфер, очередь сообщений и буфер записи одинаковы?

вот фанковая версия в bash

#!/bin/bash

r=""
res=""
while read line; do
if [[ "$line" =~ ^(r[0-9]+f:[^ \t]+)[[:space:]]+\!+.+$ ]]; then
  r="${BASH_REMATCH[1]}"
fi
if [[ "$line" =~ ^(\+[0-9]+\..+[0-9])[[:space:]]+\!+.+$ ]]; then
  res="${BASH_REMATCH[1]}"
fi
if [[ -n "$r" ]] && [[ -n "$res" ]]; then
  echo -e "$r\t\t$res"
  r=""
  res=""
fi
done < <(grep -E "^r[0-9]+f:|^\+[0-9]+\." /path/to/yourfile)

это добавит 2 "вкладки" между вашими полями, не знаю, нужно ли вам это. И мой grep немного «широкий», вы можете настроить это, если хотите.

результат:

:/tmp$ bash script 
r1f:O2+2PD=>2O-PD       +7.000000E-02  +0.000000E00  +0.000000E00
r2f:C3H6+2PD=>C3H6-PD       +9.800000E-01  +0.000000E00  +0.000000E00
r3f:C3H6+O-PD+PD=>C3H5-PD+OH-PD     +2.747319E-01  +0.000000E00  +0.000000E00
r4f:H2+2PD=>2H-PD       +4.600000E-02  +0.000000E00  +0.000000E00
r5f:H2O+PD=>H2O-PD      +2.492452E-01  +0.000000E00  +0.000000E00
r6f:CO2+PD=>CO2-PD      +5.000000E-03  +0.000000E00  +0.000000E00

Что касается +75%, то это немного усложняет задачу, так как bash не может обрабатывать действительные числа. Итак, вот грязное решение с bash и awk.

#!/bin/bash

while read line; do
if [[ "$line" =~ ^(r[0-9]+f:[^ \t]+)[[:space:]]+\!+.+$ ]]; then
  r="${BASH_REMATCH[1]}"
fi
if [[ "$line" =~ ^(\+[0-9\.Ee-]+)[[:space:]]+(\+[0-9\.Ee-]+)[[:space:]]+(\+[0-9\.Ee-]+)[[:space:]]+\!+.+$ ]]; then
  res1="${BASH_REMATCH[1]}"
  res2="${BASH_REMATCH[2]}"
  res3="${BASH_REMATCH[3]}"
  res1=$(echo $res1 | awk '{ printf "%.6E",$1*1.75 }')
  res3=$(echo $res3 | awk '{ printf "%.6E",$1*1.75 }')
fi
if [[ -n "$r" ]] && [[ -n "$res1" ]] && [[ -n "$res2" ]] && [[ -n "$res3" ]]; then
  echo -e "$r\t\t+$res1\t\t$res2\t\t+$res3"
  r=""
  res1=""
  res2=""
  res3=""
fi
done < <(grep -E "^r[0-9]+f:|^\+[0-9]+\." /path/to/yourfiles)

Как видите, там есть часть awk, которая просто умножает ваше 1-е и 3-е значение на 1,75. Затем вы можете настроить это по своему усмотрению.

результат:

:/tmp$ bash script 
r1f:O2+2PD=>2O-PD       +1.225000E-01       +0.000000E00        +0.000000E+00
r2f:C3H6+2PD=>C3H6-PD       +1.715000E+00       +0.000000E00        +0.000000E+00
r3f:C3H6+O-PD+PD=>C3H5-PD+OH-PD     +4.807808E-01       +0.000000E00        +0.000000E+00
r4f:H2+2PD=>2H-PD       +8.050000E-02       +0.000000E00        +0.000000E+00
r5f:H2O+PD=>H2O-PD      +4.361791E-01       +0.000000E00        +0.000000E+00
r6f:CO2+PD=>CO2-PD      +8.750000E-03       +0.000000E00        +0.000000E+00
0
06.04.2021, 00:16
1 ответ

«Кольцевой буфер» используется для регистрации ранних сообщений, которые выдаются до того, как будет запущен какой-либо демон syslog. Эта концепция заимствована из -операционных систем реального времени.

Структура данных кольцевого буфера представляет собой просто (предварительно -выделенную )область памяти ядра плюс пару указателей. Он доступен для регистрации в момент запуска ядра. Ему точно не нужно выделять ресурсы, он не рассчитывает на то, что что-то уже работает.Если «что-то пойдет не так» при запуске системы (до такой степени, что rsyslogdне запускается ), dmesgпокажет эти ранние сообщения, которые могут помочь.

При запуске демон системного журнала считывает кольцевой буфер и создает/обрабатывает записи журнала.

Позже, когда система запущена и работает, демон syslog выполняет регулярный буферизованный дисковый ввод-вывод, запись в файлы журнала, синхронизацию после каждой записи (см.man 3 fflush). Однако если имя файла журнала начинается с «-», синхронизация остается за схемой буферизации диска.

2
28.04.2021, 22:54

Теги

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