|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Nov 2007
Messaggi: 93
|
[UNIX] Script shell - come estrarre due valori su due righe diverse da un file di log
Ciao a tutti,
vi scrivo in quanto ho bisogno di un aiuto su come estrapolare delle informazioni da un file di log con comandi unix o con uno script Shell. Io vorrei estrapolare da un file di log il tempo che ci impiega la query cioè grep "exec time: " ma al tempo stesso filtrare anche in base all'ora, poi con un cut -d " " -f(x) prenderei il valore dell'esecuzione della query.. Il problema è che si trovano su due righe diverse (una sopra e l'altra sotto) Codice:
2014-05-08 15:09:09,692 DEBUG - localhost - [UID=] - exec time: 1 ms - sql statement: <QUERY ESEGUITA..............> -- result: 0 -- debug connection: 11111111 Codice:
grep " - exec time:" file.log | grep "$( date "+%Y-%m-%d %H" )" | cut -d " " -f5 Avete per caso qualche soluzione al mio caso? Grazie mille in anticipo. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Vedi se la tua versione di grep supporta l'opzione -A che ti consente di stampare un certo numero di righe successive a quella dove si trova la corrispondenza:
grep -A 1 "$( date "+%Y-%m-%d %H" )" file.logSe poi vuoi unire le due righe puoi usare xargs: grep -A 1 "$( date "+%Y-%m-%d %H" )" file.log | xargs -L 2 echoe infine usi cut per selezionare le colonne che ti interessano. |
|
|
|
|
|
#3 | |
|
Member
Iscritto dal: Nov 2007
Messaggi: 93
|
Quote:
grazie mille per l'aiuto.. Allora...ho provato a fare come mi hai detto ma non riesco ad unire le due righe. Il grep con il -A1 funziona correttamente ma poi il comando xargs non me li unisce. Ho provato ad usare questo comando: Codice:
grep -A1 " WARN - " file.log | xargs -L 2 echo Grazie in anticipo. |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Cosa succede esattamente? Viene generato un errore oppure ottieni un risultato diverso?
Verifica che la tua versione di xargs supporti l'opzione -L, altrimenti possiamo utilizzare un comando diverso. |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Nov 2007
Messaggi: 93
|
No nessun errore....Ottengo però un risultato diverso...Cioè il comando non unisce le due righe che vorrei unire...
La versione di xargs è questa: xargs --version xargs (GNU findutils) 4.4.2 Copyright (C) 2007 Free Software Foundation, Inc. e facendo un man xargs l'opzione -L risulta essere presente. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Puoi fornirmi 3/4 righe del file che vorresti elaborare? (ovviamente contenenti le righe che vuoi estrarre)
|
|
|
|
|
|
#7 | ||
|
Member
Iscritto dal: Nov 2007
Messaggi: 93
|
Quote:
Quote:
La prima riga ha la data e la seconda riga il tempo di esecuzione con la query loggata |
||
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Mea culpa, ho dimenticato che l'opzione -A fa in modo che il grep inserisca nell'output delle linee contenenti "--" per separare i risultati, per cui bisogna eliminarli prima di passare l'output ad xargs:
grep -A1 " WARN - " file.log | grep -v "^--$" | xargs -L 2 echo |
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Nov 2007
Messaggi: 93
|
Figurati...ci mancherebbe altro..
Ho provato ad eseguire il nuovo comando ma purtroppo questa volta non mi esce nulla...cioè il risultato è una riga vuota: Codice:
[user@machine script]$ grep -A1 " WARN - " filelog.log | grep -v "^--$" | xargs -L 2 echo [user@machine script]$ |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Il nome del file è corretto?
Verifica che ogni comando produca l'ouput previsto: Il primo grep deve produrre una cosa del genere: bla bla WARN - bla bla tsk tsk -- bla bla WARN - bla bla tsk tsk Il secondo grep: bla bla WARN - bla bla tsk tsk bla bla WARN - bla bla tsk tsk E xargs: bla bla WARN - bla bla tsk tsk bla bla WARN - bla bla tsk tsk Se il problema è su xargs possiamo sostituirlo con un comando tra awk, sed e paste opportunamente parametrizzati. |
|
|
|
|
|
#11 | ||
|
Member
Iscritto dal: Nov 2007
Messaggi: 93
|
Sorry...mancava uno spazio dopo il WARN che mi ha fregato nel copa e incolla e non me ne ero accorto... :-D
Ho però ancora un errore che infatti mi ritorna 2 risultati in meno rispetto a quello dovrei ricevere: Quote:
Quote:
Però non ho capito bene cosa fa il comando di awk...Sono ancora poco esperto in materia di comandi complesi di unix.. Ultima modifica di pumapc : 30-05-2014 alle 16:03. Motivo: Errore |
||
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Evidentemente nelle righe che hai estratto vi sono degli apici non chiusi che danno fastidio ad xargs, in effetti è meglio utilizzare altri comandi (anche se sembrano più complessi).
Il comando awk serve proprio per la manipolazione delle stringhe, in particolare quello utilizzato da te non fa altro che impostare il separatore dei record in output secondo questo criterio:
In tal modo le righe verranno concatenate una volta con il punto e virgola e una volta con a capo, generando righe concatenate due a due. |
|
|
|
|
|
#13 |
|
Member
Iscritto dal: Nov 2007
Messaggi: 93
|
Ciao Daniels,
grazie mille per il grande aiuto e per tutte le info!! Mi rivedrò un pò come funziona l'AWK perchè ho capito in generale come funziona ma faccio ancora fatica a capire i vari paramtri inseriti all'interno dell'AWK... |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Quote:
Comunque i parametri fanno questo: ORS significa "Output Record Separator", quindi "ORS=bla" imposta il separatore dei record di output a "bla". NR sta per Numero di Riga. L'espressione "A % B" divide A per B e restituisce il resto della divisione. L'operazione "NR%2" quindi vale 0 per le righe pari e 1 per quelle dispari. L'espressione "cond ? A : B" vale "A" se "cond" è vera, "B" in caso contrario; il valore zero viene interpretato come false, qualunque altro valore come vero. L'espressione 'NR%2?";":"\n"' vale quindi ";" per le righe dispari e "\n" per le righe pari. Poiché le righe pari e quelle dispari vengono una si e una no, ne conseguirà che i record di input verranno concatenati due a due. Ultima modifica di Daniels118 : 25-06-2014 alle 12:56. |
|
|
|
|
|
|
#15 | |
|
Member
Iscritto dal: Nov 2007
Messaggi: 93
|
Quote:
Ciao Daniels, fantastico...grazie mille per la spiegazione molto accurata.. Ora mi ètutto un pò più chiaro anche se devo farci un pò di pratica e fare qualche esempio per capire meglio l'awk. Una cosa e il parametro ";" a cosa servirebbe? per dividere le due righe concatenate una dal ":" e l'altra dallo "\n" ? |
|
|
|
|
|
|
#16 | ||
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Scusami, nel precedente messaggio ho commesso un errore di battitura scrivendo i due punti al posto del punto e virgola, l'affermazione corretta è questa:
Quote:
Quote:
Comunque il termine corretto non è "parametro" ma "operatore", infatti i simboli "?:" nel costrutto espressione_booleana ? espressione1 : espressione2prendono il nome di "operatore condizionale". Ultima modifica di Daniels118 : 25-06-2014 alle 12:57. |
||
|
|
|
|
|
#17 | |
|
Member
Iscritto dal: Nov 2007
Messaggi: 93
|
Quote:
Si in effetti meglio chiamare operatore che parametro... Grazie mille di tutto.. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:58.




















