2017-03-11 1 views
1

In Bezug auf den folgenden Befehl habe ich versucht, durch Leerzeichen getrennten Inhalt einer Protokolldatei in ein Array (arr) einzufügen, dann eine Bedingung zum Suchen und Extrahieren einer bestimmten Zeichenfolge heraus. Das Problem ist, dass die Zeichenkette durch einfache Anführungszeichen umgeben ist, und ich weiß nicht, was die richtige Syntax ist diese Zitate in Bedingungsanweisung einzubeziehen:Linux/Bash Wenn Bedingung gleich einem String ist, der ein einzelnes Zitat enthält

cat file.log | nawk '{split($0,arr," "); for (i=1;i<=NF;i++) if (arr[i]=='serviceid') printf ("%s,%s\n",arr[i],arr[i+1])}' 

Ich habe versucht diese:

cat file.log | nawk '{split($0,arr," "); for (i=1;i<=NF;i++) if (arr[i]=="'serviceid'") printf ("%s,%s\n",arr[i],arr[i+1])}' 

cat file.log | nawk '{split($0,arr," "); for (i=1;i<=NF;i++) if (arr[i]=="\'serviceid\'") printf ("%s,%s\n",arr[i],arr[i+1])}' 

Ich habe auch versucht, basierend auf einzelnen Zitat wie split($0,arr,/\'/) zu teilen, aber es schlägt auch fehl.

Log

Dies ist ein Teil des Stammes: 'serviceid': 1002, ist der Teil ich versuche zu navigieren. Wenn ich print arr[301] ausführe, gibt es 'serviceid': zurück. Aber wenn ich für (i = 1; i < = NF; i ++) befehle, wenn (arr [i] == 'serviceid',) {print $ i} Ich bekomme Syntaxfehler um einfache Anführungszeichen.

'originTransactionID': '00720170311', 'serviceFeeExpiryDate': datetime.datetime(2019, 12, 23, 12, 0, tzinfo=), 'accountFlagsBefore': {'activationStatusFlag': True, 'supervisionPeriodExpiryFlag': False, 'supervisionPeriodWarningActiveFlag': False, 'negativeBarringStatusFlag': False, 'serviceFeePeriodExpiryFlag': False, 'serviceFeePeriodWarningActiveFlag': False}, 'serviceid': 1002, 'supervisionExpiryDate': datetime.datetime(2019, 12, 23, 12, 0, tzinfo=), 'dedicatedAccountInformation': [{'startDate': datetime.datetime(9999, 12, 31, 0, 0, tzinfo=), 'dedicatedAccountValue1': '0', 'dedicatedAccountID': 1 
+1

Es wäre schön, wenn Sie ein kurzes Beispiel der Protokolldatei enthalten sind, so können wir unseren Code testen. – sorontar

+0

Ich legte das Protokoll unter. Danke, – aschkant

+0

Verwenden Sie \ 047, wo Sie das Angebot möchten. Ordnen Sie das normalerweise einer Var in BEGIN zu und verwenden Sie dann das :) – grail

Antwort

2

einfach eine Variable, die den Wert enthalten, die Sie wollen:

awk -v str="'serviceid'" … … 

, dass die Notwendigkeit für komplexe im Skript zitiert wird vermieden.
Das ganze awk-Skript befindet sich in einfachen Anführungszeichen, was die Verwendung von einfachen Anführungszeichen erschwert.

Auch das Beispiel der von Ihnen geposteten Protokolldatei enthält ein Feld mit einem Doppelpunkt 'serviceid':. Wenn die Felder auf Leerzeichen aufgeteilt sind.
Sie können das an die oben definierte Variable anhängen oder den Operator ~ (match) anstelle des Operators == (equal) verwenden. Dieser Operator (~) stimmt mit jedem Feld überein, das 'serviceid' enthält.

So:

nawk -vstr="'serviceid'" ' 
    $0~str{ 
     split($0,arr," "); 
     for (i=1;i<=NF;i++) 
      if (arr[i]~str) 
       printf ("%s,%s\n",arr[i],arr[i+1]) 
    }' file.log 

Beachten Sie, dass es keine Notwendigkeit für eine Katze ist, wie awk (nawk in diesem Fall) ist eines der besten Lage, Dateien zu lesen.
Außerdem fügte ich $0~str hinzu, um nur Zeilen zu verarbeiten, die solchen Text enthalten.

In einer Zeile:

nawk -vstr="'serviceid'" '$0~str{ split($0,arr," "); for (i=1;i<=NF;i++) if (arr[i]~str) printf ("%s,%s\n",arr[i],arr[i+1]) }' infile 
+0

Variable funktioniert! Danke sorontar :) – aschkant

+0

@aschkant Wenn die Antwort geholfen hat, Ihr Problem zu lösen, ist es üblich, die Antwort zu "akzeptieren". Bitte lesen Sie [Was soll ich tun, wenn jemand meine Frage beantwortet?] (Http://stackoverflow.com/help/someone-answers) – sorontar

+0

Fertig, liebe @sorontar ^^ – aschkant

Verwandte Themen