0

正規表現を使用して syslog メッセージから programname を抽出するにはどうすればよいですか? syslog メッセージを処理するために正規表現を受け入れる Java ストリーム処理モジュールがあります。

ログ行は次のようになります。

2013-10-14T22:05:29+00:00 hostname sshd[6359]: Connection closed by 192.168.1.10
2013-10-14T22:05:29+00:00 hostname sshd:3322 Connection closed by 192.168.1.10
2013-10-14T22:05:29+00:00 hostname sshd/6359 Connection closed by 192.168.1.10
2013-10-14T22:05:29+00:00 hostname sshd Connection closed by 192.168.1.10
2013-10-14T22:05:29+00:00 hostname SSHD[1133] Connection closed by 192.168.1.10
2013-10-14T22:05:29+00:00 hostname SSH.D[6359]: Connection closed by 192.168.1.10

文字列抽出プロセスは、次のようにする必要があります: スペースで区切られた 3 番目の部分文字列を取得し、、、、またはスペースで終わる部分文字列を[抽出し:ます/

したがって、最初の 4 つのログ サンプルでは、​​抽出された文字列はsshd、5 番目SSHDと 6 番目になりSSH.Dます。これは正規表現で可能ですか?

編集:

私が試したのは((?:[A-Za-z][A-Za-z0-9_.-]+))うまくいくようですが、正直なところ、正規表現の例を変更し、オンラインツールを使用してユースケースに合うように微調整しましたが、どのように機能したかは正確にはわかりません.

4

4 に答える 4

0

あなたが探していると思う正規表現は次のとおりです。

String regex = "([^\\[:/]+).*";

.*0 個以上の任意の文字に一致することを示します。ドット スターの前に一対の括弧を置くと().*、Matcher から選択できるグループが作成されます。これは括弧の最初のセットであるため、グループ番号 1 で参照されます。括弧内には[^]+、OP で指定された文字、具体的には「[」、「:」を含む否定文字クラスの 1 つ以上に一致する式があります。 、および「/」文字。

結果をテストするアプリケーションの例を次に示します。

package com.stackexchange.stackoverflow;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Question19370191 {
    public static void main(String[] args) {
        String regex = "([^\\[:/]+).*";
        Pattern pattern = Pattern.compile(regex);

        List<String> lines = new ArrayList<>();
        lines.add("2013-10-14T22:05:29+00:00 hostname sshd[6359]: Connection closed by 192.168.1.10");
        lines.add("2013-10-14T22:05:29+00:00 hostname sshd:3322 Connection closed by 192.168.1.10");
        lines.add("2013-10-14T22:05:29+00:00 hostname sshd/6359 Connection closed by 192.168.1.10");
        lines.add("2013-10-14T22:05:29+00:00 hostname sshd Connection closed by 192.168.1.10");
        lines.add("2013-10-14T22:05:29+00:00 hostname SSHD[1133] Connection closed by 192.168.1.10");
        lines.add("2013-10-14T22:05:29+00:00 hostname SSH.D[6359]: Connection closed by 192.168.1.10");

        for(String line : lines) {
            String field = line.split("\\s")[2];
            String extraction = "";
            Matcher matcher = pattern.matcher(field);
            if(matcher.matches()) {
                extraction = matcher.group(1);
            }

            System.out.println(String.format("Field \"%-12s\" Extraction \"%s\"", field, extraction));
        }
    }
}

以下を出力します。

Field "sshd[6359]: " Extraction "sshd"
Field "sshd:3322   " Extraction "sshd"
Field "sshd/6359   " Extraction "sshd"
Field "sshd        " Extraction "sshd"
Field "SSHD[1133]  " Extraction "SSHD"
Field "SSH.D[6359]:" Extraction "SSH.D"
于 2013-10-14T23:06:35.210 に答える
0

サンプルデータが提供したものとまったく同じになる場合:

(?:.+?\s){2}([\w\.]+).+$

説明:

(?:.+?\s){2}...2 番目のスペースまで一致

([^\s[:/]+)...「 」、「:」、または「/」以外のものに一致

.+$...EOL に一致

あなたが望むものは、キャプチャされたグループになります\1

于 2013-10-15T01:14:32.510 に答える