Domanda

Ricevo in ingresso dal server nel modo seguente (dati di input di esempio):

[1284336000]: host1;event1;flag;state;counter;errors or warnings
[1284336000]: host2;event1;flag;state;counter;errors or warnings
[1284336000]: host1;event2;flag;state;counter;errors or warnings
[1284336000]: host2;event2;flag;state;counter;errors or warnings

devo abbinare l'ingresso e in base alla partita, creare una variabile con un valore di hostname-eventname.

Il mio Regex

^\[\d+\]:\s((host1);(event1)|(host2);(event2)|(host3);(event2)|(host2);(event1));(\w+);(\w+);(\d).+$

Voglio il nome dell'host e l'evento separatamente in variabili di riferimento come $2 o $3.

Per esempio, si consideri questo ingresso:

[1284336000]: host1;event1;flag;state;counter;errors or warnings

Ho bisogno di creare una variabile con un nome <hostname-eventname> in base al nome host e eventName prelevato dalla partita di cui sopra.

Di ',

$myVar=$2-$3  (that is, $myVar=host1-event1)

Non è possibile applicare alcuna operazione di divisione oltre. Quindi, nessuna programmazione: posso leggere solo i dati di input. E sì, l'espressione regolare è di Perl tipo regex.

Non so se ho chiarito la mia domanda o no?

È stato utile?

Soluzione

È necessario utilizzare l'operatore di filiale-reset, (?|…|…|…):

^\[\d+\]:\s(?|(host1);(event1)|(host2);(event2)|(host3);(event2)|(host2);(event1));(\w+);(\w+);(\d).+$

O, più leggibile:

m{
    ^ \[ \d+ \] : \s
    (?| (host1);(event1)  # $1, $2
      | (host2);(event2)  # $1, $2
      | (host3);(event2)  # $1, $2
      | (host2);(event1)  # $1, $2
    )
    ;
    (\w+);(\w+)           # $3, $4
    ; (\d)                # $5
    .+ $
}x

Altri suggerimenti

È possibile utilizzare

"^\[\d+\]:\s([^;]*);([^;]*)"

e hanno l'host e nome dell'evento nei primi due gruppi di cattura.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top