Нелегко увидеть, когда система остановлена, но dmesg -w
покажет что-то при возобновлении работы системы.
Лучшим способом может быть запуск логгера в консоли:
while : ; do sleep 1 ; date +%FT%T >> downtime.log ; done
и поиск отсутствующих логов.
Вы также можете рассчитать время простоя:
while : ; do sleep 1 ; NEW=$(date +%s) ; echo $(date +%FT%T) $((NEW-LST)) >> downtime.log ; LST=$NEW ; done
Это немного дольше, поэтому используйте скрипт:
#! /bin/bash
LST=$(date +%s)
while : ; do
sleep 1
NEW=$(date +%s)
echo $(date +%FT%T) $((NEW-LST)) >> downtime.log
LST=$NEW
done
Идем медленно. Если есть файл с таким содержимым (всего в одну строку, чтобы было проще показать):
$ cat infile
list[1]; i[ab1]; var[1] [1]var [1]var[2]
Простой grep --color a
покажет красным цветом все буквы a. (Поскольку этот сайт позволяет управлять цветами :Предположим, что жирный шрифт — красный):
$ grep --color a infile
list[1]; i[
аb1]; v
аr[1] [1]v
аr [1]v
аr[2]
Точно то же самое происходит, если a не -в кавычках (, как указано выше ), или если оно заключено в кавычки:
$ grep --color \a infile
list[1]; i[
аb1]; v
аr[1] [1]v
аr [1]v
аr[2]
$ grep --color "a" infile
list[1]; i[
аb1]; v
аr[1] [1]v
аr [1]v
аr[2]
$ grep --color 'a' infile
list[1]; i[
аb1]; v
аr[1] [1]v
аr [1]v
аr[2]
Почему? Потому что "а" оба:
a
в качестве первого аргумента. Либо обратная косая черта, либо двойная кавычка, либо одинарная кавычка. Если мы хотим выделить фигурные скобки ]
(, начнем с закрывающей скобки):
$ grep --color ] infile
list[1
]; i[ab1
]; var[1
][1
]var [1
]var[2
]
То же самое произойдет, если ]
были процитированы (любой цитатой ).
В этом случае ]
является специальным для оболочки, но не в этом случае, когда нет соответствующей открывающей скобки.
Для закрывающей скобки все становится на один шаг сложнее. Все это вызывает ошибку:
grep --color [ infile
grep --color '[' infile
grep --color "[" infile
Почему? Потому что то, что grep получает в всех случаях, является одним [
.
Вы можете понять, что делает оболочка с помощью этого простого эха:
$ echo \[ "[" '['
[ [ [
Оболочка удаляет один уровень цитирования, и все значения выглядят одинаково.
Но то, что grep хочет получить, чтобы понять, что мы на самом деле ищем символ [
, — это квадратная скобка в кавычках с обратной косой чертой(\[
).Так и будет со всем этим:
$ echo \\[ "\[" '\['
\[ \[ \[
И grep будет работать с любым из них:
$ grep --color \\[ infile
list
[ 1]; i
[ ab1]; var
[ 1]
[ 1]var
[ 1]var
[2]
Использование[[]
(списка символов только с одним символом )приведет к тому же результату (, пока он заключен в кавычки ).
$ grep --color '[[]' infile
list
[ 1]; i
[ ab1]; var
[ 1]
[ 1]var
[ 1]var
[2]
Grep должен получить ровно [[]
, чтобы это работало. Может показаться, что кавычки действительно не нужны:
$ echo \[\[\] "[[]" '[[]' [[]
[[] [[] [[] [[]
Но если вы создадите файл с именем [
, эта идея сломается:
$ touch \[
$ echo \[\[\] "[[]" '[[]' [[]
[[] [[] [[] [
, потому что [
является специальным для оболочки. В оболочке он запускает шаблон подстановки имени файла. Если файл (или несколько )соответствуют шаблону, подставляется список файлов.
Итак, это будет работать правильно:
$ grep --color '[[]' infile
list
[ 1]; i
[ ab1]; var
[ 1]
[ 1]var
[ 1]var
[2]
И это:grep --color '[]]' infile
будет соответствовать закрывающей фигурной скобке.
Чтобы сопоставить открывающую квадратную скобку и закрывающую квадратную скобку, вам нужна определенная последовательность символов (в кавычках, конечно ).
Если вы попробуете это:
$ grep --color '[[]]' infile
Совпадения не будет, вообще никакого. Это нужно для правильной работы:
$ grep --color '[][]' infile
list
[1
] ; i
[ab1
] ; var
[1
] [
1
] var
[1
] var
[2
]
В этом конкретном порядке закрывающая фигурная скобка должна быть первым символом внутри диапазона символов.Открывающая фигурная скобка должна быть последним символом в списке символов.
Затем вы можете добавить другие символы (, только не;
):
$ grep --color '[]a-z0-9[]' infile
список[1];
i[ab1];
переменная[1][1]переменная
[1]переменная[2]
Затем вы можете добавить отсутствующий |
в диапазон и выполнить сопоставление по ссылке, которую вы разместили. Регулярное выражение в этой ссылке не такое, как здесь, и работает совсем по-другому. Он начинается с сопоставления одного [
, некоторых других символов и заканчивается закрывающим ]
. Что-то похожее на (жадный характер *
занимает всю линейку):
$ grep --color '\[.*\]' infile
list
[1]; я[аб1]; вар[1] [1]вар[1]вар[2]
Или подобное этому:
$ grep --color '[[][a-c0-9]*[]]' infile
list
[1] ; i
[ab1]; var
[1] [1]
var
[1] var
[2] `
Здесь слишком много переменных и необъявленных предположений, чтобы исчерпывающе ответить на ваш вопрос.
Основная ловушка здесь заключается в том, что оболочка (, т.е. большинство Bourne -совместимых оболочек -, на самом деле не уверенных в zsh или csh и производных )по умолчанию будет проходить через нерасширенный глобус , если он ничего не соответствует. Таким образом, выражение, подобное \\[[a-z0-9]*\\]
, сначала используется как подстановочный знак. Если нет соответствующих файлов, (таких как \fno[rd\]
, где все неалфавитные символы являются буквальными ), подстановочный знак передается в grep
дословно.
(Давайте рассмотрим это снова. Это двойная обратная косая черта, то есть обратная косая черта в кавычках, за которой следуют две открывающиеся квадратные скобки. Первый создает класс символов, первый символ которого является вторым, литералом [
. Результат синтаксического анализа этого регулярного выражения другой, но такой же запутанный.)
Единственным разумным решением этой проблемы является правильное цитирование всего, что не нуждается в маркировке пробелами и расширении подстановочных знаков оболочкой. Я рекомендую использовать одинарные кавычки для всех ваших регулярных выражений. Тогда вы сможете сформировать разумное ожидание того, что и как будет совпадать, без двух экспертных интерпретаций (одной оболочки, одного регулярного выражения )ваших шаблонов.
Если вы пытаетесь полностью сопоставить var[1]
, регулярное выражение вроде [a-z]*\[[0-9]*\]
делает что-то подобное. Если вы хотите, чтобы квадратные скобки были частью класса символов, попробуйте [][a-z0-9]*
, где первая ]
и вторая [
являются буквальными членами класса символов. И помните об одинарных кавычках, если вы передаете их в grep
в оболочке.