Regex, чтобы получить слова после соответствующей строки
Ниже приведено содержание:
Subject:
Security ID: S-1-5-21-3368353891-1012177287-890106238-22451
Account Name: ChamaraKer
Account Domain: JIC
Logon ID: 0x1fffb
Object:
Object Server: Security
Object Type: File
Object Name: D:\ApacheTomcat\apache-tomcat-6.0.36\logs\localhost.2013-07-01.log
Handle ID: 0x11dc
Мне нужно записать слова после слова Object Name:
в этой строке. Это D:\ApacheTomcat\apache-tomcat-6.0.36\logs\localhost.2013-07-01.log
.
Надеюсь, кто-то может мне помочь.
^.*\bObject Name\b.*$
matches - Имя объекта
Ответы
Ответ 1
Для вас должно работать следующее:
[\n\r].*Object Name:\s*([^\n\r]*)
Рабочий пример
Ваше желаемое совпадение будет в группе захвата 1.
[\n\r][ \t]*Object Name:[ \t]*([^\n\r]*)
Было бы похоже, но не допускать такие вещи, как "blah Object Name: blah", а также следить за тем, чтобы не захватывать следующую строку, если нет фактического содержимого после "Имя объекта:"
Ответ 2
Но мне нужен результат совпадения... не в группе соответствия...
Для того, что вы пытаетесь сделать, это должно сработать. \K
сбрасывает начальную точку совпадения.
\bObject Name:\s+\K\S+
Вы можете сделать то же самое для получения соответствия Security ID
.
\bSecurity ID:\s+\K\S+
Ответ 3
Ты почти там. Используйте следующее регулярное выражение (с включенной поддержкой нескольких строк)
\bObject Name:\s+(.*)$
Полное совпадение было бы
Object Name: D:\ApacheTomcat\apache-tomcat-6.0.36\logs\localhost.2013-07-01.log
в то время как захваченная группа будет содержать
D:\ApacheTomcat\apache-tomcat-6.0.36\logs\localhost.2013-07-01.log
Если вы хотите напрямую захватить путь к файлу, используйте
(?m)(?<=\bObject Name:).*$
Ответ 4
Вот быстрый perl script, чтобы получить то, что вам нужно. Нужен небольшой пробел.
#!/bin/perl
$sample = <<END;
Subject:
Security ID: S-1-5-21-3368353891-1012177287-890106238-22451
Account Name: ChamaraKer
Account Domain: JIC
Logon ID: 0x1fffb
Object:
Object Server: Security
Object Type: File
Object Name: D:\\ApacheTomcat\\apache-tomcat-6.0.36\\logs\\localhost.2013- 07-01.log
Handle ID: 0x11dc
END
my @sample_lines = split /\n/, $sample;
my $path;
foreach my $line (@sample_lines) {
($path) = $line =~ m/Object Name:([^s]+)/g;
if($path) {
print $path . "\n";
}
}
Ответ 5
Это может сработать для вас в зависимости от того, какой язык вы используете
(?<=Object Name:).*
Это положительное утверждение. Более подробную информацию можно найти здесь
Он не будет работать с java script. В вашем комментарии я прочитал, что вы используете его для logstash. Если вы используете разбор GROK для logstash, это сработает. Вы можете проверить себя здесь
https://grokdebug.herokuapp.com/
![введите описание изображения здесь]()
Ответ 6
Это решение python.
import re
line ="""Subject:
Security ID: S-1-5-21-3368353891-1012177287-890106238-22451
Account Name: ChamaraKer
Account Domain: JIC
Logon ID: 0x1fffb
Object:
Object Server: Security
Object Type: File
Object Name: D:\ApacheTomcat\apache-tomcat-6.0.36\logs\localhost.2013-07-01.log
Handle ID: 0x11dc"""
regex = (r'Object Name:\s+(.*)')
match1= re.findall(regex,line)
print (match1)
*** Remote Interpreter Reinitialized ***
>>>
['D:\\ApacheTomcat\x07pache-tomcat-6.0.36\\logs\\localhost.2013-07-01.log']
>>>