2017-12-11 5 views
0

Ich analysiere eine Datei, die Zeichenfolgen mit Nginx GET Anfrage Körper enthält. Und manchmal enthält es Zeilenumbrüche zwischen zwei Teilen derselben Anfrage, so dass ich eine solche Anfrage mit awk nicht analysieren kann.Newline zwischen Trennzeichen in awk

Ich habe zwei Trennzeichen mit awk -F'delimeter1: |delimiter2' und vielleicht kann ich irgendwie awk sagen, dass es einen Zeilenumbruch zwischen diesen Trennzeichen geben kann, so würde es solche zwei Zeilen als eine verarbeiten?

Vielen Dank im Voraus.

Probeneingang (Java Fehler sind zufällig Beispiel):

[2017-12-04 20:53:07] [ERROR] [ID-XX] Get: sr=342x487&c64=(not set)&c1=Phones, MP3s, GPS&v=1&c33=427&d28= 
Like 
&je=0&s4d=4-b&c32=(not set)&ua=Opera/9.80 (Android; Opera Mini/32.0.2254/77.161; U; uk) Presto/2.12.423 Version/12.16&time=04/Dec/2017:20:52:02 +0200&qtype=get 
com.test.app. java.lang.StringIndexOutOfBoundsException: String index out of range: -1 
      at sun.font.CompositeStrike.getStrikeForSlot(CompositeStrike.java:75) 
      at sun.font.CompositeStrike.getFontMetrics(CompositeStrike.java:93) 
      at sun.font.FontDesignMetrics.initMatrixAndMetrics(FontDesignMetrics.java:359) 
      at sun.font.FontDesignMetrics.<init>(FontDesignMetrics.java:350) 
      at sun.font.FontDesignMetrics.getMetrics(FontDesignMetrics.java:302) 
      at sun.swing.SwingUtilities2.getFontMetrics(SwingUtilities2.java:1113) 
      at javax.swing.JComponent.getFontMetrics(JComponent.java:1626) 
      at javax.swing.text.WrappedPlainView.updateMetrics(WrappedPlainView.java:318) 
      at javax.swing.text.WrappedPlainView.updateChildren(WrappedPlainView.java:297) 
      at javax.swing.text.WrappedPlainView.insertUpdate(WrappedPlainView.java:463) 
      at javax.swing.plaf.basic.BasicTextUI$RootView.insertUpdate(BasicTextUI.java:1610) 
      at javax.swing.plaf.basic.BasicTextUI$UpdateHandler.insertUpdate(BasicTextUI.java:1869) 
      at javax.swing.text.AbstractDocument.fireInsertUpdate(AbstractDocument.java:201) 
      at javax.swing.text.AbstractDocument.handleInsertString(AbstractDocument.java:748) 
      at javax.swing.text.AbstractDocument.insertString(AbstractDocument.java:707) 
      at javax.swing.text.PlainDocument.insertString(PlainDocument.java:130) 
      at javax.swing.text.DefaultEditorKit.read(DefaultEditorKit.java:273) 
      at javax.swing.JEditorPane.setText(JEditorPane.java:1416) 
    Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -1 
      at java.lang.String.substring(String.java:1967) ~[?:1.8.0_151] 
      ... 12 more 
[2017-12-04 21:03:07] [ERROR] [ID-YY] Get: sr=342x487&c64=(not set)&c1=Phones, MP3s, GPS&v=1&em=Exception: Error: [$sc:ind] Aborting!&ua=Opera/9.80 (Android; Opera Mini/30.0.2254/77.161; U; ru) Presto/2.12.423 Version/12.16&time=04/Dec/2017:21:03:07 +0200&qtype=get 
com.test.app. java.lang.StringIndexOutOfBoundsException: String index out of range: -1 
      at sun.font.CompositeStrike.getStrikeForSlot(CompositeStrike.java:75) 
      at sun.font.CompositeStrike.getFontMetrics(CompositeStrike.java:93) 
      at sun.font.FontDesignMetrics.initMatrixAndMetrics(FontDesignMetrics.java:359) 
      at sun.font.FontDesignMetrics.<init>(FontDesignMetrics.java:350) 
      at sun.font.FontDesignMetrics.getMetrics(FontDesignMetrics.java:302) 
      at sun.swing.SwingUtilities2.getFontMetrics(SwingUtilities2.java:1113) 
      at javax.swing.JComponent.getFontMetrics(JComponent.java:1626) 
      at javax.swing.text.WrappedPlainView.updateMetrics(WrappedPlainView.java:318) 
      at javax.swing.text.WrappedPlainView.updateChildren(WrappedPlainView.java:297) 
      at javax.swing.text.WrappedPlainView.insertUpdate(WrappedPlainView.java:463) 
      at javax.swing.plaf.basic.BasicTextUI$RootView.insertUpdate(BasicTextUI.java:1610) 
      at javax.swing.plaf.basic.BasicTextUI$UpdateHandler.insertUpdate(BasicTextUI.java:1869) 
      at javax.swing.text.AbstractDocument.fireInsertUpdate(AbstractDocument.java:201) 
      at javax.swing.text.AbstractDocument.handleInsertString(AbstractDocument.java:748) 
      at javax.swing.text.AbstractDocument.insertString(AbstractDocument.java:707) 
      at javax.swing.text.PlainDocument.insertString(PlainDocument.java:130) 
      at javax.swing.text.DefaultEditorKit.read(DefaultEditorKit.java:273) 
      at javax.swing.JEditorPane.setText(JEditorPane.java:1416) 
    Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -1 
      at java.lang.String.substring(String.java:1967) ~[?:1.8.0_151] 
      ... 12 more 
[2017-12-04 19:40:02] [ERROR] [ID-ZZ] Get: el=search&dl=https://market.com/?dt=Market – Electronics Store | Web Store (Market.com)&id=104777577&a=770227875&t=pageview&ua=Mozilla/5.0 (Linux; Android 7.0; RNE-L21 Build/HUAWEIRNE-L21) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36&time=04/Dec/2017:19:39:04 +0200&qtype=get 
com.test.app. java.lang.StringIndexOutOfBoundsException: String index out of range: -1 
      at sun.font.CompositeStrike.getStrikeForSlot(CompositeStrike.java:75) 
      at sun.font.CompositeStrike.getFontMetrics(CompositeStrike.java:93) 
      at sun.font.FontDesignMetrics.initMatrixAndMetrics(FontDesignMetrics.java:359) 
      at sun.font.FontDesignMetrics.<init>(FontDesignMetrics.java:350) 
      at sun.font.FontDesignMetrics.getMetrics(FontDesignMetrics.java:302) 
      at sun.swing.SwingUtilities2.getFontMetrics(SwingUtilities2.java:1113) 
      at javax.swing.JComponent.getFontMetrics(JComponent.java:1626) 
      at javax.swing.text.WrappedPlainView.updateMetrics(WrappedPlainView.java:318) 
      at javax.swing.text.WrappedPlainView.updateChildren(WrappedPlainView.java:297) 
      at javax.swing.text.WrappedPlainView.insertUpdate(WrappedPlainView.java:463) 
      at javax.swing.plaf.basic.BasicTextUI$RootView.insertUpdate(BasicTextUI.java:1610) 
      at javax.swing.plaf.basic.BasicTextUI$UpdateHandler.insertUpdate(BasicTextUI.java:1869) 
      at javax.swing.text.AbstractDocument.fireInsertUpdate(AbstractDocument.java:201) 
      at javax.swing.text.AbstractDocument.handleInsertString(AbstractDocument.java:748) 
      at javax.swing.text.AbstractDocument.insertString(AbstractDocument.java:707) 
      at javax.swing.text.PlainDocument.insertString(PlainDocument.java:130) 
      at javax.swing.text.DefaultEditorKit.read(DefaultEditorKit.java:273) 
      at javax.swing.JEditorPane.setText(JEditorPane.java:1416) 
    Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -1 
      at java.lang.String.substring(String.java:1967) ~[?:1.8.0_151] 
      ... 12 more 

gewünschte Ausgabe (Druck ID und des Körpers (in "") in einer Zeile und ersetzen & mit _&_):

ID-XX "sr=342x487_&_c64=(not set)_&_c1=Phones, MP3s, GPS_&_v=1_&_c33=427_&_d28=Like_&_je=0_&_s4d=4-b_&_c32=(not set)_&_ua=Opera/9.80 (Android; Opera Mini/32.0.2254/77.161; U; uk) Presto/2.12.423 Version/12.16_&_time=04/Dec/2017:20:52:02 +0200_&_qtype=get" 
ID-YY "sr=342x487_&_c64=(not set)_&_c1=Phones, MP3s, GPS_&_v=1_&_em=Exception: Error: [$sc:ind] Aborting!_&_ua=Opera/9.80 (Android; Opera Mini/30.0.2254/77.161; U; ru) Presto/2.12.423 Version/12.16_&_time=04/Dec/2017:21:03:07 +0200_&_qtype=get" 
ID-ZZ "el=search_&_dl=https://example.market.com/?dt=Market – Electronics Store | Web Store (Market.com)_&_id=104777577_&_a=770227875_&_t=pageview_&_ua=Mozilla/5.0 (Linux; Android 7.0; RNE-L21 Build/HUAWEIRNE-L21) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36_&_time=04/Dec/2017:19:39:04 +0200_&_qtype=get" 

Es gibt nicht viel von diesen zerrissenen Anforderungszeichenfolgen, die meisten davon sind wie erwartet in einer Zeile. Außerdem gibt es nur eine GET-Anfrage mit einem Fehler, so dass das Suchmuster Get nicht enthalten sollte (es ist nicht notwendig).

+0

Vielen Dank für Ihre Aufmerksamkeit, @ John1024. Hoffe, meine Klarstellung ist klar. –

+0

@ cardinal-grey: Es gibt _always_ drei Sätze von Linien wie diese? – Inian

+0

@Inian nein, es gibt nicht viel von diesen zerrissenen Anfragekörpern, die meisten von ihnen sind wie erwartet in einer Zeile. –

Antwort

1

Awk Lösung:

awk 'f{ if (/^\[/) { printf "\042\n"; f=0 } else printf("%s", $0) } 
    /Get:/{ 
     f=1; gsub(/[\[\]]/, "", $4); id=$4; sub(/^.* Get: /, ""); 
     gsub("&", "_&_"); printf "%s \042%s",id,$0 
    } 
    END{ if (f) printf "\042\n" }' file 
  • / Get:/ - auf "Get Anfrage" Linie
    • f=1 Begegnung - f ist ein Marker untergeordnete/innere Verarbeitung angibt
    • id=$4 - c ID Feld (für ex. ID-XX)

Der Ausgang:

ID-XX "sr=342x487_&_c64=(not set)_&_c1=Phones, MP3s, GPS_&_v=1_&_c33=427_&_d28=Like&je=0&s4d=4-b&c32=(not set)&ua=Opera/9.80 (Android; Opera Mini/32.0.2254/77.161; U; uk) Presto/2.12.423 Version/12.16&time=04/Dec/2017:20:52:02 +0200&qtype=get" 
ID-YY "sr=342x487_&_c64=(not set)_&_c1=Phones, MP3s, GPS_&_v=1_&_em=Exception: Error: [$sc:ind] Aborting!_&_ua=Opera/9.80 (Android; Opera Mini/30.0.2254/77.161; U; ru) Presto/2.12.423 Version/12.16_&_time=04/Dec/2017:21:03:07 +0200_&_qtype=get" 
ID-ZZ "el=search_&_dl=https://market.com/?dt=Market – Electronics Store | Web Store (Market.com)_&_id=104777577_&_a=770227875_&_t=pageview_&_ua=Mozilla/5.0 (Linux; Android 7.0; RNE-L21 Build/HUAWEIRNE-L21) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36_&_time=04/Dec/2017:19:39:04 +0200_&_qtype=get" 
+0

Danke für die Hilfe, Mann, es funktioniert gut, aber, wie ich schon sagte, es ist Java-Protokoll, so dass es viele trashige Ausgabe mit Klassennamen usw. nach jeder dieser Fehlermeldungen enthält. Weißt du nicht, wie kann ich vermeiden, dass sie am Ende jeder "ID" request_body "' string hinzufügen? Ich werde der Frage einige Beispielstrings hinzufügen. Danke im Voraus. –

0

Ich verstehe Sie die Zeile mit ERROR behalten wollen und sie formatiert werden.

Wir wissen nicht, was das Trennzeichen ist.

Es ist seltsam, dass Sie am Ende der Linie erhalten bleiben.

können Sie versuchen, diese sed

sed ' 
/.*ERROR] \[/!d      # get the line with ERROR 
s///        # delete all from start to ID 
:A 
/=get$/!{N;bA}      # if the line not end with =get; get one more 
s/\([^]]*\)[^:]*: \(.*\)/\1 "\2"/ # remove Get: and add " 
s/\n//g        # remove \n 
s/&/_&_/g       # replace & by _&_ 
' infile 
Verwandte Themen