используя egrep, чтобы найти пропущенный @ в журнале

Я использую следующую команду для поиска записей журнала, которые являются результатом входа в систему на почтовом сервере:

egrep '_login[^ ]' /var/log/exim_mainlog

Это прекрасно работает для поиска записей, содержащих содержимое, подобное этому:

P=esmtpa A=courier_login:name@email.net S=1573 id=f1cd08396,...

Но что мне нужно сделать, это изменить мой оператор grep, чтобы он находил логины с одним словом, которые не используют знак @, например:

 P=esmtpa A=courier_login:name S=1573 id=f1cd08396,...

Где вход в систему раньше было "name@email.net", но во второй записи журнала использовался только "имя".

Возможно ли это с помощью grep или egrep, возможно, в каком-то составном выражении?

Большое спасибо.

1
задан 27 June 2013 в 13:30

2 ответа

Если требуется извлечь только имена для входа в систему, которые не содержат символ, следующее sed команда могла бы произойти удобная:

echo -e "P=esmtpa A=courier_login:name1@email.net S=1573 id=f1cd08396,...\nP=esmtpa A=courier_login:name2 S=1573 id=f1cd08396,..." | \
sed -nr 's/^.*_login:([^ @]+) .*$/\1/p'

Запущение этого скрипта приведет к выводу ниже:

name2

Некоторое объяснение:

  • Первая строка просто повторяет 2 строки данных в качестве примера (разделенный новой строкой \n символ).

  • Вторая строка содержит sed -nr команда, которая в этом случае использует s/regexp/replacement/p синтаксис. Это (s) ищет строку соответствие regexp регулярное выражение (-r). Если часть строки подобрана, replacement будет использоваться для замены части соответствия. -n переключатель и p команда только требуется, чтобы опускать строки, которые не соответствуют regexp.

  • sed определяет местоположение строки"_login:"в строке. В том положении:

    • Открывающая скобка отмечает запуск подвыражения. (Считайте это регионом строки.)
    • [^ @]+ соответствует еще одному символу, который не является ни пространством, ни. Это расширится, пока пробел не найден.
    • Закрывающая скобка отмечает конец подвыражения незадолго до этого символа. Подобранный регион хранится в названной переменной \1.
  • Если Вы смотрите на regexp разделите его, в основном следует ^.*something.*$ шаблон. ^.* соответствия любые символы в начале строки до выражения что-то. Так же .*$ соответствия любые символы в конце строки после выражения что-то. Соответствие целой строке с regexp важно, потому что целая подобранная часть заменяется.
  • Сменная деталь только содержит \1 переменная, таким образом подобранным именем для входа в систему заменят.
0
ответ дан 27 June 2013 в 13:30

Расширенное регулярное выражение _login[^ ][^@]+\s должно сделать это.

Это буквенная строка _login, за которой следует символ, который не является пробелом, за которым следует по крайней мере один символ, который не является @, за которым следует символ пробела.

0
ответ дан 27 June 2013 в 13:30

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

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