Что такое экранирование

Нелегко увидеть, когда система остановлена, но 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
0
11.07.2017, 16:32
2 ответа

Идем медленно. Если есть файл с таким содержимым (всего в одну строку, чтобы было проще показать):

$ 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]

Почему? Потому что "а" оба:

  1. Не специально для оболочки.
  2. Оболочка удаляет кавычки, и grep получает тот же 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 ]

В этом конкретном порядке закрывающая фигурная скобка должна быть первым символом внутри диапазона символов.Открывающая фигурная скобка должна быть последним символом в списке символов.

[]a -z0 -9[]

Затем вы можете добавить другие символы (, только не;):

$ 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] `

1
28.01.2020, 02:25

Здесь слишком много переменных и необъявленных предположений, чтобы исчерпывающе ответить на ваш вопрос.

Основная ловушка здесь заключается в том, что оболочка (, т.е. большинство Bourne -совместимых оболочек -, на самом деле не уверенных в zsh или csh и производных )по умолчанию будет проходить через нерасширенный глобус , если он ничего не соответствует. Таким образом, выражение, подобное \\[[a-z0-9]*\\], сначала используется как подстановочный знак. Если нет соответствующих файлов, (таких как \fno[rd\], где все неалфавитные символы являются буквальными ), подстановочный знак передается в grepдословно.

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

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

Если вы пытаетесь полностью сопоставить var[1], регулярное выражение вроде [a-z]*\[[0-9]*\]делает что-то подобное. Если вы хотите, чтобы квадратные скобки были частью класса символов, попробуйте [][a-z0-9]*, где первая ]и вторая [являются буквальными членами класса символов. И помните об одинарных кавычках, если вы передаете их в grepв оболочке.

2
28.01.2020, 02:25

Теги

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