2016-07-31 11 views
-1

Ich habe ein Skript, das Fehlermeldungen aus db2diag.log extrahieren. Ich muss die SQL-Abfragen extrahieren, die den Deadlock aus der folgenden Datei verursacht haben.wie grep unter sql Teil von db2 Fehlerprotokoll

Inhalt der Datei: log.txt

db2inst1 , WSCOMUSR , MESSAGE : ADM5501I DB2 is performing lock escalation. The affected application 
      is named "db2jcc_application", and is associated with the workload 
      name "SYSDEFAULTUSERWORKLOAD" and application ID 
      "173.10.105.33.59586.13011817552" at member "0". The total number of 
      locks currently held is "1249935", and the target number of locks to 
      hold is "624967". The current statement being executed is "delete 
      from DMEXPLOG where CREATED < ? ". Reason code "1" 


db2inst1 , WSCOMUSR , MESSAGE : ADM5501I DB2 is performing lock escalation. The affected application 
      is named "db2jcc_application", and is associated with the workload 
      name "SYSDEFAULTUSERWORKLOAD" and application ID 
      "173.10.105.33.59586.13011817552" at member "0". The total number of 
      locks currently held is "1249935", and the target number of locks to 
      hold is "624967". The current statement being executed is "select 
      * from DMEXPLOG where CREATED < ?". Reason code "1" 

Erforderliche Ausgabe: alle SQL-Abfragen

1. delete 
      from DMEXPLOG where CREATED < ? 
2. select 
      * from DMEXPLOG where CREATED < ? 

wie diese. Ich möchte alle SQL-Teile aus der Datei. Beliebige grep oder Awk/sed Lösung, um die erforderliche Ausgabe zu erhalten?

Plattform: Unix (AIX)

+2

Bitte werfen Sie einen Blick auf [Editieren-Hilfe] übersetzt werden (http://stackoverflow.com/editing- Hilfe). – Cyrus

Antwort

0
awk '{gsub(/^.*The current statement being executed is \"|\". Reason code.*$/,""); print NR". "$0}' log.txt 
1. delete from DMEXPLOG where CREATED < ? 
2. 
3. select * from DMEXPLOG where CREATED < ? 

Die passenden Saiten kürzer kein Zweifel sein könnten und 2. ist leer, da die Daten eine Leerzeile zwischen den tatsächlichen Daten hatten vorgestellt. Gibt es Leerzeilen in den eigentlichen Daten?

0

Vielleicht Diese Hilfe Sie

[email protected]:/tmp$ sed -n '/select/,/^$/p;/delete/,/^$/p;/insert/,/^$/p;/update/,/^$/p' log.txt | sed -n '/^[0-9]/!H;//x;$x;s/\n\([^A]\)/ \1/gp' | awk -F'"' '{printf("%d.\t %s\n", NR, $4)}' 
1. delete    from DMEXPLOG where CREATED < ? 
2. select   * from DMEXPLOG where CREATED < ? 
0

Ihr aktuelles Beispiel kann mit

sed -n '/statement being executed/ s/.*"//p; /Reason code/ s/".*//p' log