2017-05-08 3 views
-4

Ich habe eine große Protokolldatei von der ich brauche nur zwei Spalten. Im Folgenden finden Sie eine einzelne Zeile aus der Protokolldatei:Ich habe eine Protokolldatei mit verschiedenen Spalten und davon brauche ich nur zwei Spalten

[2017-05-02 13:02:25,986] [AJPRequestHandler-HTTPThreadGroup-10239] SID0003457|10.22.165.22|13|16|FAILED|500||<?xml version="1.0" encoding="UTF-8"?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Header><ns1:SessionType xmlns:ns1="http://tough.example.com/webservices">STATELESS</ns1:SessionType><ns2:UsernameToken xmlns:ns2="http://tough.example.com/webservices">ocore-intg_w [email protected]</ns2:UsernameToken><ns3:PasswordText xmlns:ns3="http://tough.example.com/webservices">UdontsoiuN</ns3:PasswordText></S:Header><S:Body><getExternalPortalUserElement xmlns="http://ws.web. tough1.tough.example.com/"><emailAddress>[email protected]</emailAddress></getExternalPortalUserElement></S:Body></S:Envelope>|{http://ws.web.tough1.tough.example.com/}getExternalPortalUserElement|<n s1:Header xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/"><ns1:SessionType xmlns:ns1="http://tough.example.com/webservices">STATELESS</ns1:SessionType><ns2:UsernameToken xmlns:ns2="http://tough.example.com/webservices">[email protected]</ns2:UsernameToken><ns3:PasswordText xmlns:ns3="http://tough.example.com/webservices">UiojdfdoiNN</ns3:PasswordText></ns1:Header>|0|620|null

Ich brauche nur die Ausgabe in einer separaten Datei mit Datum aus der Protokolldatei, die ein Ding wie erste Spalte und E-Mail-Adresse ist, diese

2017-05-02 13:02:25 [email protected]

Kann jemand helfen, ging ich durch mehrere Seiten, aber nicht wie oben formatieren.

+6

Zeigen Sie uns Ihren Code. Was hast du probiert? Welche Probleme haben Sie? –

+1

Willkommen bei StackOverflow. Dies ist kein kostenloser Codierungsdienst. Bitte nimm eine [Tour] und lies [ask]. – Picard

+0

* "Ich kopiere nur eine Zeile aus dem Logfile" * Aber Sie haben vier Textzeilen geschrieben, daher ist es unmöglich zu erraten, wie die Originaldaten aussehen. – Borodin

Antwort

1
#!/usr/bin/perl 
use strict; 
use warnings; 

my $data = '[2017-05-02 13:02:25,986] [AJPRequestHandler-HTTPThreadGroup-10239] SID0003457|10.22.165.22|13|16|FAILED|500||<?xml version="1.0" encoding="UTF-8"?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Header><ns1:SessionType xmlns:ns1="http://tough.example.com/webservices">STATELESS</ns1:SessionType><ns2:UsernameToken xmlns:ns2="http://tough.example.com/webservices">ocore-intg_w 
[email protected]</ns2:UsernameToken><ns3:PasswordText xmlns:ns3="http://tough.example.com/webservices">UdontsoiuN</ns3:PasswordText></S:Header><S:Body><getExternalPortalUserElement xmlns="http://ws.web. 
tough1.tough.example.com/"><emailAddress>[email protected]</emailAddress></getExternalPortalUserElement></S:Body></S:Envelope>|{http://ws.web.tough1.tough.example.com/}getExternalPortalUserElement|<n 
s1:Header xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/"><ns1:SessionType xmlns:ns1="http://tough.example.com/webservices">STATELESS</ns1:SessionType><ns2:UsernameToken xmlns:ns2="http://tough.example.com/webservices">[email protected]</ns2:UsernameToken><ns3:PasswordText xmlns:ns3="http://tough.example.com/webservices">UiojdfdoiNN</ns3:PasswordText></ns1:Header>|0|620|null'; 

if ($data =~ m!^\[(\d{4}-\d{2}-\d{2})\s+(\d{2}:\d{2}:\d{2}).*<emailAddress>([^<>]*)<\/emailAddress>!gs){ 
    print "$1 $2 $3"; 
} 

Ausgang: 2017-05-02 13:02:25 [email protected]

Working demo

+0

'([^ <>] *)' ist '(. *)' Vorzuziehen, falls zwei oder mehr solcher Elemente im XML vorhanden sind. – Borodin

+0

@Borodin: Ich verstehe, danke. –

0

Verwenden Perl als

$ perl -ne '/\[(.*?)\].*\s+(\S+)\|\{/;print "$1 $2\n";' file1 
2017-05-02 13:02:25,986 [email protected]@example.com 

Jetzt mit dem editierten Beispiel folgt

perl -e 'undef $/;$content=<ARGV>;while($content=~/\[(.*?)\].*?<emailAddress>(.*)<\/emailAddress>/sg){print "$1 $2\n";}' file1 
+0

Wie ist das nützlich, wenn das OP um '2017-05-02 13:02:25 park.phanon23 @ example.com' gebeten hat? – Borodin

+0

@Borodin Die Frage hat sich geändert, ich habe nicht nur etwas Input erfunden, oder? Denk darüber nach !! –

+0

Version eins der Frage erfordert ein Ergebnis von '2017-05-02 13:02:25 park.phanon23 @ example.com' – Borodin

0

Noch ein andere Art und Weise die erwartete Ausgabe zu erhalten:

my $date_email = ""; 
while(<DATA>) 
{ 
    my $line = $_; 
    $date_email .= "date = $1\t" if($line=~m/^\[([^\[\]]*)\]/m); 
    $date_email .= "email = $1\n" if($line=~m/<emailAddress>([^<>]*)<\/emailAddress>/); 

} 

print $date_email; 

__DATA__ 
[2017-05-02 13:02:25,986] [AJPRequestHandler-HTTPThreadGroup-10239] SID0003457|10.22.165.22|13|16|FAILED|500||<?xml version="1.0" encoding="UTF-8"?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Header><ns1:SessionType xmlns:ns1="http://tough.example.com/webservices">STATELESS</ns1:SessionType><ns2:UsernameToken xmlns:ns2="http://tough.example.com/webservices">[email protected]</ns2:UsernameToken><ns3:PasswordText xmlns:ns3="http://tough.example.com/webservices">UdontsoiuN</ns3:PasswordText></S:Header><S:Body><getExternalPortalUserElement xmlns="http://ws.web.tough1.tough.example.com/"><emailAddress>[email protected]</emailAddress></getExternalPortalUserElement></S:Body></S:Envelope>|{http://ws.web.tough1.tough.example.com/}getExternalPortalUserElement|<ns1:Header xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/"><ns1:SessionType xmlns:ns1="http://tough.example.com/webservices">STATELESS</ns1:SessionType><ns2:UsernameToken xmlns:ns2="http://tough.example.com/webservices">[email protected]</ns2:UsernameToken><ns3:PasswordText xmlns:ns3="http://tough.example.com/webservices">UiojdfdoiNN</ns3:PasswordText></ns1:Header>|0|620|null 

Ausgang:

date = 2017-05-02 13:02:25,986 email = [email protected]

-1

Versuch:

awk 'NR==1{gsub(/\[/,"",$1);gsub(/,.*/,"",$2);VAL=$1 FS $2;next }{;match($0,/<emailAddress>.*<\/emailAddress>/);if(substr($0,RSTART,RLENGTH)){print VAL, substr($0,RSTART+14,RLENGTH-29)}}' Input_file 

Hier im obigen Code Ich suche erste Linie zu bekommen, die Zeit und date und entferne unnötige Zeichen in ihnen. Dann, abgesehen von der ersten Zeile, passe ich die Regex an und überprüfe dann, ob diese Übereinstimmung in irgendeiner Zeile vorhanden ist, falls vorhanden, dann drucke die erste Zeilenvariable (die Datum und Zeit darin enthält) mit dieser Übereinstimmung der Regex der Email-ID .

EDIT: Hinzufügen einer nicht-Liner-Form der Lösung auch jetzt.

awk 'NR==1{ 
       gsub(/\[/,"",$1); 
       gsub(/,.*/,"",$2); 
       VAL=$1 FS $2; 
       next 
      } 
      {; 
       match($0,/<emailAddress>.*<\/emailAddress>/); 
       if(substr($0,RSTART,RLENGTH)){ 
               print VAL, substr($0,RSTART+14,RLENGTH-29) 
              } 
      } 
    ' Input_file 
Verwandte Themen