Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica
Il nuovo gimbal mobile DJI evolve il concetto di tracciamento automatico con tre modalità diverse, un modulo multifunzionale con illuminazione integrata e controlli gestuali avanzati. Nel gimbal è anche presente un'asta telescopica da 215 mm con treppiede integrato, per un prodotto completo per content creator di ogni livello
Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce
Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce
Abbiamo provato il nuovo HUAWEI Pura 80 Pro. Parliamo di uno smartphone che è un vero capolavoro di fotografia mobile, grazie ad un comparto completo in tutto e per tutto, In questa colorazione ci è piaciuto molto, ma i limiti hardware e software, seppur in netto miglioramento, ci sono ancora. Ma HUAWEI ha fatto davvero passi da gigante per questa nuova serie Pura 80. Buona anche l'autonomia e soprattutto la ricarica rapida sia cablata che wireless, velocissima.
Opera Neon: il browser AI agentico di nuova generazione
Opera Neon: il browser AI agentico di nuova generazione
Abbiamo provato il nuovo web browser con intelligenza artificiale della serie Opera accessibile tramite abbonamento. Ecco le nostre prime impressioni sulle funzionalità di Opera Neon basate su AI e come funzionano
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 08-05-2014, 15:28   #1
pumapc
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
e quindi il comando:
Codice:
grep " - exec time:" file.log | grep "$( date "+%Y-%m-%d %H" )" | cut -d " " -f5
non mi darebbe dei risultati soddisfacenti.

Avete per caso qualche soluzione al mio caso?

Grazie mille in anticipo.
pumapc è offline   Rispondi citando il messaggio o parte di esso
Old 14-05-2014, 14:19   #2
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
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.log
Se poi vuoi unire le due righe puoi usare xargs:
grep -A 1 "$( date "+%Y-%m-%d %H" )" file.log | xargs -L 2 echo
e infine usi cut per selezionare le colonne che ti interessano.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 29-05-2014, 18:10   #3
pumapc
Member
 
Iscritto dal: Nov 2007
Messaggi: 93
Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
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.log
Se poi vuoi unire le due righe puoi usare xargs:
grep -A 1 "$( date "+%Y-%m-%d %H" )" file.log | xargs -L 2 echo
e infine usi cut per selezionare le colonne che ti interessano.
Ciao Daniels118,
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
Dov'è che sbaglio?

Grazie in anticipo.
pumapc è offline   Rispondi citando il messaggio o parte di esso
Old 29-05-2014, 18:39   #4
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
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.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2014, 10:18   #5
pumapc
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.
pumapc è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2014, 12:06   #6
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Puoi fornirmi 3/4 righe del file che vorresti elaborare? (ovviamente contenenti le righe che vuoi estrarre)
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2014, 13:52   #7
pumapc
Member
 
Iscritto dal: Nov 2007
Messaggi: 93
Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
Puoi fornirmi 3/4 righe del file che vorresti elaborare? (ovviamente contenenti le righe che vuoi estrarre)
Tipo così:

Quote:
2014-05-30 05:00:01,166 WARN - localhost - Task - [machine#Scheduler-00011]
[ID=] - exec time: 1053 ms - sql statement: SELECT * FROM ( SELECT...............
Ovviamente non tutte le righe sono a WARN ma sono presenti anche a DEBUG e quindi con un grep -A1 prendo le due righe che mi interessano...

La prima riga ha la data e la seconda riga il tempo di esecuzione con la query loggata
pumapc è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2014, 14:17   #8
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
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
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2014, 15:35   #9
pumapc
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]$
pumapc è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2014, 15:42   #10
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
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.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2014, 16:02   #11
pumapc
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:
grep -A1 " WARN - " file.log | grep -v "^--$" | xargs -L 2 echo | cut -d":" -f4
1202 ms - sql statement
1053 ms - sql statement
1627 ms - sql statement
2140 ms - sql statement
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
1249 ms - sql statement
1192 ms - sql statement
1967 ms - sql statement
Parlando di awk e guardando su internet ho trovato questo comando awk 'ORS=NR%2?";":"\n"' e adattandolo al mio comando mi ritorna tutte le righe interessate:

Quote:
grep -A1 " WARN - " file.log | grep -v "^--$" | awk 'ORS=NR%2?";":"\n"' | cut -d":" -f4
1202 ms - sql statement
1053 ms - sql statement
1627 ms - sql statement
2140 ms - sql statement
1249 ms - sql statement
1192 ms - sql statement
1967 ms - sql statement
1732 ms - sql statement
1031 ms - sql statement
E' corretto?

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
pumapc è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2014, 16:14   #12
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
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:
  • punto e virgola se il numero di riga è pari
  • a capo se il numero di riga è dispari
i numeri di riga partono da 1.
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.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2014, 12:22   #13
pumapc
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...
pumapc è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2014, 12:50   #14
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Quote:
Originariamente inviato da pumapc Guarda i messaggi
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...
Figurati...
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.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 23-06-2014, 11:04   #15
pumapc
Member
 
Iscritto dal: Nov 2007
Messaggi: 93
Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
Figurati...
Comunque i parametri fatto 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 pari e "\n" per le righe dispari.
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.

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" ?
pumapc è offline   Rispondi citando il messaggio o parte di esso
Old 23-06-2014, 11:24   #16
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
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:
L'espressione 'NR%2?";":"\n"' vale quindi ";" per le righe dispari e "\n" per le righe pari.
La tua domanda diventerebbe quindi:
Quote:
Una cosa e il parametro ":" a cosa servirebbe? per dividere le due righe concatenate una dal ";" e l'altra dallo "\n" ?
Più che dividere in questo caso bisognerebbe dire unire, infatti noi non vogliamo separare le righe ma unirle due a due e il ";" è il carattere con cui le uniamo (potremmo anche mettere semplicemente "", ma poi non sarebbe più possibile capire dove finiva la riga precedente e dove cominciava la successiva). Anche nel caso del "\n" le stiamo unendo, solo che tale carattere è proprio il separatore di riga, pertanto le righe resteranno divise, se preferisci puoi dire che le stai unendo con un divisore
Comunque il termine corretto non è "parametro" ma "operatore", infatti i simboli "?:" nel costrutto
espressione_booleana ? espressione1 : espressione2
prendono il nome di "operatore condizionale".

Ultima modifica di Daniels118 : 25-06-2014 alle 12:57.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 23-06-2014, 11:37   #17
pumapc
Member
 
Iscritto dal: Nov 2007
Messaggi: 93
Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
Scusami, nel precedente messaggio ho commesso un errore di battitura scrivendo i due punti al posto del punto e virgola, l'affermazione corretta è questa:

La tua domanda diventerebbe quindi:

Più che dividere in questo caso bisognerebbe dire unire, infatti noi non vogliamo separare le righe ma unirle due a due e il ";" è il carattere con cui le uniamo (potremmo anche mettere semplicemente "", ma poi non sarebbe più possibile capire dove finiva la riga precedente e dove cominciava la successiva). Anche nel caso del "\n" le stiamo unendo, solo che tale carattere è proprio il separatore di riga, pertanto le righe resteranno divise, se preferisci puoi dire che le stai unendo con un divisore
Comunque il termine corretto non è "parametro" ma "operatore", infatti i simboli "?:" nel costrutto
espressione_booleana ? espressione1 : espressione2
prendono il nome di "operatore condizionale".
Figurati ci mancherebbe altro... Anzi grazie mille per la notevole spiegazione e pazienza :-D

Si in effetti meglio chiamare operatore che parametro...

Grazie mille di tutto..
pumapc è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica DJI Osmo Mobile 8: lo stabilizzatore per smartph...
Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce Recensione Pura 80 Pro: HUAWEI torna a stupire c...
Opera Neon: il browser AI agentico di nuova generazione Opera Neon: il browser AI agentico di nuova gene...
Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi Wind Tre 'accende' il 5G Standalone in Italia: s...
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh OPPO Find X9 Pro: il camera phone con teleobiett...
1.200 CV e drift a 213 km/h: la supercar...
Shenzhou-21: esperimenti sui topi in orb...
Cloudera punta su cloud privato e intell...
Il mistero del Ryzen 7 9700X3D: prezzo p...
Posticipato il rientro dell'equipaggio c...
Propaganda russa e hactivism fra le prin...
Superluna del Castoro: stasera il satell...
NVIDIA regala una GeForce RTX 5090 Found...
Snowflake punta su Intelligence, l'IA pe...
Volkswagen realizzerà i propri chip per ...
Formula E GEN4 svelata: 600 kW di potenz...
PC Desktop HP Victus con RTX 4060 e Ryze...
Fastnet, il 'mega-cavo' di AWS che pu&og...
Offerte Amazon da non perdere: GeForce R...
Clima, l'UE trova l'accordo sul taglio d...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 23:58.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v