I erhalten haben einige Protokolle ts.log genannt, dieShell-Skripten Variable awk übergeben und doppelte Anführungszeichen benötigt
aussehen[957670][DEBUG:2016-11-30 16:49:17,968:com.ibatis.common.logging.log4j.Log4jImpl.debug(Log4jImpl.java:26)]{pstm-9805256} Parameters: []
[957670][DEBUG:2016-11-30 16:49:17,968:com.ibatis.common.logging.log4j.Log4jImpl.debug(Log4jImpl.java:26)]{pstm-9805256} Types: []
[957670][DEBUG:2016-11-30 16:50:17,969:com.ibatis.common.logging.log4j.Log4jImpl.debug(Log4jImpl.java:26)]{rset-9805257} ResultSet
[957670][DEBUG:2016-11-30 16:51:17,969:com.ibatis.common.logging.log4j.Log4jImpl.debug(Log4jImpl.java:26)]{rset-9805257} Header: [LAST_INSERT_ID()]
[957670][DEBUG:2016-11-30 16:52:17,969:com.ibatis.common.logging.log4j.Log4jImpl.debug(Log4jImpl.java:26)]{rset-9805257} Result: [731747]
[065417][DEBUG:2016-11-30 16:53:17,986:sdk.protocol.process.InitProcessor.process(InitProcessor.java:61)]query String=requestid=10547
habe ich ein Skript, in dem es gibt etw wie
#!/bin/bash
begin=$1
cat ts.log | awk -F '[ ,]' '{if($2 ~/^[0-2][0-9]:[0-6][0-9]:[0-6][0-9]&& $2>="16:50:17"){print $0}}'
statt Die Zeit wie 16:50:17 eingeben Ich möchte einfach $ 1 der Shell an awk übergeben, so dass alles, was ich tun muss, ist ./script time: hh: mm: ss Das Skript wird wie folgt aussehen:
#!/bin/bash
begin=$1
cat ts.log | awk -v var=$begin -F '[ ,]' '{if($2 ~/^[0-2][0-9]:[0-6][0-9]:[0-6][0-9]&& $2>="var"){print $0}}'
Aber die doppelten Anführungszeichen müssen da sein ODER es wird nicht funktionieren. Ich versuchte 2> "\" "var" \ " , aber es funktioniert nicht. also gibt es eine Möglichkeit, die Anführungszeichen dort zu halten? bevorzugtes Ergebnis ./script dann extrahieren Sie das Protokoll von der Zeit als $ 1 angegeben.
Was tun all diese '\ 1' und' \ 2'? Beachten Sie, dass Sie '{print $ 0}' weglassen und direkt 'awk -F '[,]' -v var =" 16:50:17 "'$ 2> var' Datei 'sagen können, um Datensätze zu drucken, deren zweites Feld größer ist als das gegeben in 'var'. – fedorqui
Auch der Variablenname muss nicht vorangestellt werden $ – nu11p01n73R
@EdMorton die doppelten Anführungszeichen werden für den Vergleich des Datums verwendet, ohne die es nicht funktioniert. also wenn ich die zeit manuell einfüge wie cat ts.log | awk -v var = $ beginnen -F '[,]' '{if ($ 2 ~/^ [0-2] [0-9]: [0-6] [0-9]: [0-6] [ 0-9] && $ 2> = "16:50:17") {print $ 0}} ', wird es die Logs von 16:50:17 extrahieren, aber ohne die doppelten Anführungszeichen druckt es das ganze Log. Also meine Frage ist, ob es eine Möglichkeit gibt, die Anführungszeichen dort zu behalten, während ich die Variable $ 1 der Shell an awk übergeben kann. –