Извлекать время между событиями из файла журнала в Bash

Вы можете запустить его с помощью сценария bash, который в основном «while (1) {gnome-do}», гарантируя, что при сбое gnome-do он снова запускается. Пока gnome-do запускается синхронно, он должен работать нормально. даже если система попадает в состояние, в котором она не может быть успешно запущена, воздействие будет небольшим. Если вы хотите убедиться, что даже это не проблема, вставьте команду, используя zenity. Это сообщит вам, что возникла проблема, и вам нужно нажать Enter, чтобы снова запустить gnome-do.

создать сценарий со следующим и запустить его из приложения «Запуск приложений», найденного в системе Меню настроек.

while true
do
  gnome-do
  zenity --info --text="gnome-do crashed ... press enter to restart"
done
0
задан 13 December 2017 в 13:22

6 ответов

Из вашего примера:

$ sed -nr '/0000/N;N; s/.*GPGGA,([^,]+).*/\1/p' file | sed -n '1p;$p'
161212.2
161213.8

Примечания

-n ничего не печатают, пока мы не попросим его -r использовать ERE /0000/N;N найти строку с 0000 и прочитайте следующие две строки s/old/new, замените old на new .* любые символы в строке ([^,]+), сохраните некоторые символы, которые не являются , в этой позиции \1, обратная ссылка на сохраненный паттерн |, передающий выходной сигнал другому sed (без погрешности) '1p;$p' печатать строку 1 и печатать последнюю строку

И преобразовать в секундах, которые я вам предоставляю ...

3
ответ дан 22 May 2018 в 23:19

Из вашего примера:

$ sed -nr '/0000/N;N; s/.*GPGGA,([^,]+).*/\1/p' file | sed -n '1p;$p' 161212.2 161213.8

Примечания

-n ничего не печатают, пока мы не попросим его -r использовать ERE /0000/N;N найти строку с 0000 и прочитайте следующие две строки s/old/new, замените old на new .* любые символы в строке ([^,]+), сохраните некоторые символы, которые не являются , в этой позиции \1, обратная ссылка на сохраненный паттерн |, передающий выходной сигнал другому sed (без погрешности) '1p;$p' печатать строку 1 и печатать последнюю строку

И преобразовать в секундах, которые я вам предоставляю ...

3
ответ дан 18 July 2018 в 14:25

Из вашего примера:

$ sed -nr '/0000/N;N; s/.*GPGGA,([^,]+).*/\1/p' file | sed -n '1p;$p' 161212.2 161213.8

Примечания

-n ничего не печатают, пока мы не попросим его -r использовать ERE /0000/N;N найти строку с 0000 и прочитайте следующие две строки s/old/new, замените old на new .* любые символы в строке ([^,]+), сохраните некоторые символы, которые не являются , в этой позиции \1, обратная ссылка на сохраненный паттерн |, передающий выходной сигнал другому sed (без погрешности) '1p;$p' печатать строку 1 и печатать последнюю строку

И преобразовать в секундах, которые я вам предоставляю ...

3
ответ дан 24 July 2018 в 20:23

Я бы использовал awk для чего-то вроде этого.

Идея заключалась бы в разделении записей (строк) на поля, разделенные запятыми, а затем:

if первое поле заканчивается на $GPVTG, а восьмое поле начинается с 0000, а затем устанавливает булевский флаг, указывающий, что транспортное средство остановлено, когда первое поле заканчивается на $GPGGA, и транспортное средство остановлено, сохраняя значение расстояния от второе поле в конце, напечатайте первые и последние значения расстояния

Итак

#!/usr/bin/awk -f

function printsecs(s) { 
  print substr(s,5) + 60 * (substr(s,3,2) + 60 * substr(s,1,2));
}

BEGIN {FS=","}

$1 ~ /\$GPVTG$/ && $8 ~ /^0000/ {
  stopped = 1;
} 

$1 ~ /\$GPGGA$/ && stopped {
  t[++n] = $2; 
  stopped = 0; 
} 

END {
  printsecs(t[1]); printsecs(t[n]);
}
2
ответ дан 22 May 2018 в 23:19

Я бы использовал awk для чего-то вроде этого.

Идея заключалась бы в разделении записей (строк) на поля, разделенные запятыми, а затем:

if первое поле заканчивается на $GPVTG, а восьмое поле начинается с 0000, а затем устанавливает булевский флаг, указывающий, что транспортное средство остановлено, когда первое поле заканчивается на $GPGGA, и транспортное средство остановлено, сохраняя значение расстояния от второе поле в конце, напечатайте первые и последние значения расстояния

Итак

#!/usr/bin/awk -f function printsecs(s) { print substr(s,5) + 60 * (substr(s,3,2) + 60 * substr(s,1,2)); } BEGIN {FS=","} $1 ~ /\$GPVTG$/ && $8 ~ /^0000/ { stopped = 1; } $1 ~ /\$GPGGA$/ && stopped { t[++n] = $2; stopped = 0; } END { printsecs(t[1]); printsecs(t[n]); }
2
ответ дан 18 July 2018 в 14:25

Я бы использовал awk для чего-то вроде этого.

Идея заключалась бы в разделении записей (строк) на поля, разделенные запятыми, а затем:

if первое поле заканчивается на $GPVTG, а восьмое поле начинается с 0000, а затем устанавливает булевский флаг, указывающий, что транспортное средство остановлено, когда первое поле заканчивается на $GPGGA, и транспортное средство остановлено, сохраняя значение расстояния от второе поле в конце, напечатайте первые и последние значения расстояния

Итак

#!/usr/bin/awk -f function printsecs(s) { print substr(s,5) + 60 * (substr(s,3,2) + 60 * substr(s,1,2)); } BEGIN {FS=","} $1 ~ /\$GPVTG$/ && $8 ~ /^0000/ { stopped = 1; } $1 ~ /\$GPGGA$/ && stopped { t[++n] = $2; stopped = 0; } END { printsecs(t[1]); printsecs(t[n]); }
2
ответ дан 24 July 2018 в 20:23

Другие вопросы по тегам:

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