Ищите шаблон и печать предыдущие строки, запускающиеся с другого шаблона

Вы тестировали adduser temipuser вместо useradd temipuser ???

руководство Linux для сказанного sshd_conf:

AllowUsers

    This keyword can be followed by a list of user name patterns, separated by 
spaces. If specified, login is allowed only for user names that match one of the 
patterns. Only user names are valid; a numerical user ID is not recognized. **By 
default, login is allowed for all users.** If the pattern takes the form USER@HOST 
then USER and HOST are separately checked, restricting logins to particular users 
from particular hosts. The allow/deny directives are processed in the following 
order: DenyUsers, AllowUsers, DenyGroups, and finally AllowGroups.

Таким образом, Вы не должны добавлять AllowUsers и если Вы добавляете эту опцию, я не думаю, что это предотвращает от удаленного корневого входа в систему при включении PermitRootLogin

5
26.07.2014, 12:19
4 ответа

Я думаю, что вы могли бы сделать что-нибудь наподобие

grep -zPo '.*a(?s)(?(?!a).)*?xyz' file

(с GNU grep), если ваша версия достаточно свежая для поддержки расширения PCRE) или

pcregrep -Mo '.*a(?s)(?(?!a).)*?xyz' file

Если вы хотите найти совпадение со второй инстанцией xyz в ваших выходных данных, сделайте это совпадение жадным, удалив финальную ? , например, grep -zPo '.*a(?s)(?(?!a).)*xyz' file.


Возможно, лучшим тестом является такой, с многосимвольными шаблонами как для условия старта, так и для условия стопа; учитывая

$ cat file
1 abc    
2 abc
3 abc
4 abc
5 abc
6 bbc
7 cbc
8 dbc
9 xyz
10 xyz
11 abc
12 abc

затем

$ grep -zPo '.*abc(?s)(?(?!abc).)*?xyz' file
5 abc
6 bbc
7 cbc
8 dbc
9 xyz
1
27.01.2020, 20:41

Если вас не волнуют пустые строки в выводе, попробуйте:

$ awk '
    !NF { next }
    /a/ { flag = 1; last = $0; next }
    last && flag { print last; print; last = 0; next}
    /xyz/ { print; flag = 0; next}
    flag
' file
5 a
6 b
7 c
8 d
9 xyz
10 xyz
0
27.01.2020, 20:41

Вот решение на Perl:

perl -nlE '
    if    (/a/)   { @buffer = ($_) }
    elsif (/xyz/) { push @buffer,$_; say for @buffer }
    else          { push @buffer,$_}
' your_file

Как это работает

Он читает файл построчно и выполняет одно из трех действий:

  1. Если Текущая строка соответствует шаблону a , она присваивает текущую строку массиву @buffer .
  2. Если текущая строка соответствует шаблону xyz , она помещает текущую строку в буфер и печатает его содержимое.
  3. Если ни один из двух вышеуказанных случаев не соответствует действительности, он просто добавляет текущая строка в массив @buffer .

Таким образом, всякий раз, когда новая строка соответствует шаблону a , содержимое @buffer стирается и заменяется только текущей строкой. Это гарантирует, что вы найдете ближайший a , предшествующий xyz .

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

1
27.01.2020, 20:41
tac file | sed '/xyz/,/a/!d' | tac

(если у вас нет -так, ваша команда -хвост может иметь команду -r, чтобы сделать то же самое).

1
27.01.2020, 20:41

Теги

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