Я использую следующую команду для поиска записей журнала, которые являются результатом входа в систему на почтовом сервере:
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, возможно, в каком-то составном выражении?
Большое спасибо.
Если требуется извлечь только имена для входа в систему, которые не содержат символ, следующее 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
переменная, таким образом подобранным именем для входа в систему заменят. Расширенное регулярное выражение _login[^ ][^@]+\s
должно сделать это.
Это буквенная строка _login
, за которой следует символ, который не является пробелом, за которым следует по крайней мере один символ, который не является @
, за которым следует символ пробела.