Pagina 1 di 2

[bash] pipe con output in colonne

Inviato: ven 1 feb 2008, 22:25
da danix
Ciao a tutti,
ammetto che il titolo del thread non sia dei più chiari, quindi proverò a spiegarmi meglio...
ho un file di log che ogni TOT righe contiene un valore percentuale che io estraggo con questa riga di codice:

Codice: Seleziona tutto

grep -o "[0-9][0-9][0-9]%" $input_file || grep -o "[0-9][0-9]%" $input_file || grep -o "[0-9]%" $input_file
dove (ovviamente :D ) $input_file punta al file di log...
il mio problema sorge dal momento che con questa semplice riga di codice l'output è il seguente:
1%
2%
...
25%
...
and so on... :)

mentre io vorrei ottenere solo l'ultimo valore percentuale (quello attuale), mi sembra di ricordare un comando che mi permette di fare una cosa del genere, solo che non ricordo di che comando si tratta... qualcuno di voi che sa di cosa sto parlando mi potrebbe aiutare?? Se poi sto dicendo una ca**ata e quel comando non esiste mi dite una soluzione poco dispendiosa in termini di risorse per ottenere l'output desiderato??

advTANKSance

Re: [bash] pipe con output in colonne

Inviato: ven 1 feb 2008, 22:39
da stan
Non so se ho capito bene...ma non puoi mandare l'output in pipe a tail?

Re: [bash] pipe con output in colonne

Inviato: ven 1 feb 2008, 22:40
da Mario Vanoni
danix85 ha scritto:Ciao a tutti,
ammetto che il titolo del thread non sia dei più chiari, quindi proverò a spiegarmi meglio...
ho un file di log che ogni TOT righe contiene un valore percentuale che io estraggo con questa riga di codice:

Codice: Seleziona tutto

grep -o "[0-9][0-9][0-9]%" $input_file || grep -o "[0-9][0-9]%" $input_file || grep -o "[0-9]%" $input_file
dove (ovviamente :D ) $input_file punta al file di log...
il mio problema sorge dal momento che con questa semplice riga di codice l'output è il seguente:
1%
2%
...
25%
...
and so on... :)

mentre io vorrei ottenere solo l'ultimo valore percentuale (quello attuale), mi sembra di ricordare un comando che mi permette di fare una cosa del genere, solo che non ricordo di che comando si tratta... qualcuno di voi che sa di cosa sto parlando mi potrebbe aiutare?? Se poi sto dicendo una ca**ata e quel comando non esiste mi dite una soluzione poco dispendiosa in termini di risorse per ottenere l'output desiderato??

advTANKSance
il_tuo_output | sort -n | tail -n 1
il_tuo_output | sort -nr | head - n 1

Mario Vanoni

Re: [bash] pipe con output in colonne

Inviato: ven 1 feb 2008, 22:53
da targzeta
stan ha scritto:Non so se ho capito bene...ma non puoi mandare l'output in pipe a tail?
Quoto, ti basta un tail -n1 come suggerito anche da Mario, non capisco solo perchè quest'ultimo ti suggerisce un sort.

comunque, tail a parte, il tuo comando è proprio brutto, lasciatelo dire :).
Ti basta un

Codice: Seleziona tutto

grep "[[:digit:]]%"
tanto, a prescidere se ci sono una, due o tre, sicuramente ci sarà una cifra con un percento accanto non trovi?

Spina

Re: [bash] pipe con output in colonne

Inviato: ven 1 feb 2008, 23:14
da Mario Vanoni
spina ha scritto:
stan ha scritto:Non so se ho capito bene...ma non puoi mandare l'output in pipe a tail?
Quoto, ti basta un tail -n1 come suggerito anche da Mario, non capisco solo perchè quest'ultimo ti suggerisce un sort.

comunque, tail a parte, il tuo comando è proprio brutto, lasciatelo dire :).
Ti basta un

Codice: Seleziona tutto

grep "[[:digit:]]%"
tanto, a prescidere se ci sono una, due o tre, sicuramente ci sarà una cifra con un percento accanto non trovi?

Spina
La versione di danix _e`_ portabile su tutte le shell,
la tua sicuramente sulla bash e probabilmente su quelle POSIX.
Bourne shell (sh) probabilmente no, anzi dubito assai.

Danix nell'esempio cita percentuali crescenti,
con il sort -n/-nr hai sicuramente il valore maggiore.

Mario Vanoni

Re: [bash] pipe con output in colonne

Inviato: ven 1 feb 2008, 23:21
da targzeta
Mario Vanoni ha scritto: La versione di danix _e`_ portabile su tutte le shell,
la tua sicuramente sulla bash e probabilmente su quelle POSIX.
Bourne shell (sh) probabilmente no, anzi dubito assai.
Mario, uhm, mi stupisci!!!
ti piacerebbe di più questa?

Codice: Seleziona tutto

grep "[0-9]%"
rileggiti il mio messaggio, non è tanto cosa ci metti nelle parentesi che conta!!!
Mario Vanoni ha scritto: Danix nell'esempio cita percentuali crescenti,
con il sort -n/-nr hai sicuramente il valore maggiore.

Mario Vanoni
si, ma io pensavo volesse l'ultimo in ordine di "tempo" non "il più grande", cita un file di log e un ultimo valore. Non penso gli serva un sort, ma posso anche sbagliarmi.

Spina

P.S. Poi non riesco neanche a capire quanto possa essere un problema di shell, semmai di grep dato che è a lui che affido il compitino

Re: [bash] pipe con output in colonne

Inviato: sab 2 feb 2008, 1:21
da danix
credo di aver confuso le acque prima, vi posto il file di log che devo analizzare con il mio script

Codice: Seleziona tutto

*------------------------------*
Folding@Home Gromacs Core
Version 1.90 (March 8, 2006)

Preparing to commence simulation
- Ensuring status. Please wait.
- Looking at optimizations...
- Working with standard loops on this execution.
- Previous termination of core was improper.
- Going to use standard loops.
- Files status OK
- Expanded 292172 -> 1461493 (decompressed 500.2 percent)

Project: 3040 (Run 4, Clone 227, Gen 39)

Entering M.D.
(Starting from checkpoint)
Protein: p3040_supervillin-03

Writing local files
Completed 156995 out of 5000000 steps  (3%)
il valore che mi interessa ottenere è quell'ultimo 3% tra parentesi...
usando la riga di codice che ho postato io prima ottengo il valore 3% e basta, mentre usando la riga che mi ha consigliato spina ottengo tutto il rigo in cui c'è l'occorrenza del pattern che ho cercato...

Un'altra cosa, per confondere ancora di più le acque ho anche bisogno di ottenere il solo valore numerico senza il simbolo "%", questo

Codice: Seleziona tutto

(grep -o "[0-9][0-9][0-9]%" $input_file || grep -o "[0-9][0-9]%" $input_file || grep -o "[0-9]%" $input_file) |cut -d"%" -f 1 
è un buon modo di procedere o si può fare di meglio??

grazie a tutti della disponibilità e dell'aiuto che mi state dando :)

Re: [bash] pipe con output in colonne

Inviato: sab 2 feb 2008, 8:50
da sixjan
Se il file di log è esattamente quello proposto, questa riga ti restituisce il 3.

grep Completed logfile | tail -1 | cut -f2 -d"(" | cut -f1 -d"%"

oppure

grep Completed logfile | tail -1 | awk {'print $7'} | tr -d [:punct:]

...ma si potrà far meglio :)

Saluti

Re: [bash] pipe con output in colonne

Inviato: sab 2 feb 2008, 9:46
da targzeta
danix85 ha scritto:....mentre usando la riga che mi ha consigliato spina ottengo tutto il rigo in cui c'è l'occorrenza del pattern che ho cercato...
E' vero, ho dimenticato il "-o".
danix85 ha scritto: Un'altra cosa, per confondere ancora di più le acque ho anche bisogno di ottenere il solo valore numerico senza il simbolo "%"
Partendo dal fatto che, a mio avviso, tutte le soluzioni sono una soluzione e quindi vanno bene uguale :), io a questo punto userei sed. In questo modo:

Codice: Seleziona tutto

sed -n '/([[:digit:]]\+%)/{s/.*(\([[:digit:]]\+\)%)/\1/;p}'
Spina

P.S. Se poi vuoi solo l'ultimo valore percentuale:

Codice: Seleziona tutto

sed -n '/([[:digit:]]\+%)/{s/.*(\([[:digit:]]\+\)%)/\1/;h};$b E;d; :E x;p;'

Re: [bash] pipe con output in colonne

Inviato: sab 2 feb 2008, 10:24
da danix
spina ha scritto:
danix85 ha scritto:....mentre usando la riga che mi ha consigliato spina ottengo tutto il rigo in cui c'è l'occorrenza del pattern che ho cercato...
E' vero, ho dimenticato il "-o".
danix85 ha scritto: Un'altra cosa, per confondere ancora di più le acque ho anche bisogno di ottenere il solo valore numerico senza il simbolo "%"
Partendo dal fatto che, a mio avviso, tutte le soluzioni sono una soluzione e quindi vanno bene uguale :), io a questo punto userei sed. In questo modo:

Codice: Seleziona tutto

sed -n '/([[:digit:]]\+%)/{s/.*(\([[:digit:]]\+\)%)/\1/;p}'
Spina

P.S. Se poi vuoi solo l'ultimo valore percentuale:

Codice: Seleziona tutto

sed -n '/([[:digit:]]\+%)/{s/.*(\([[:digit:]]\+\)%)/\1/;h};$b E;d; :E x;p;'
Io il man di sed l'ho guardato per la prima volta stamattina, quindi non sperare che io possa capire questi 2 comandi al volo :lol:
mi aiuteresti a leggerli??
ad esempio, la s all'inizio della parentesi graffa, che fa??

Grazie mille...

Re: [bash] pipe con output in colonne

Inviato: sab 2 feb 2008, 10:31
da targzeta
danix85 ha scritto:Io il man di sed l'ho guardato per la prima volta stamattina, quindi non sperare che io possa capire questi 2 comandi al volo :lol:
mi aiuteresti a leggerli??
ad esempio, la s all'inizio della parentesi graffa, che fa??

Grazie mille...
Bhe, è un pò complicato allora, la 's' è un comando per sed, leggi il man e vedi cosa fa il comando 's'. Per capire questi due comandi, il secondo specialmente devi prima leggerti tutto il man, altrimenti è impossibile anche cercare di spiegarti.

Spina

Re: [bash] pipe con output in colonne

Inviato: sab 2 feb 2008, 14:24
da Mario Vanoni
spina ha scritto:
Mario Vanoni ha scritto: La versione di danix _e`_ portabile su tutte le shell,
la tua sicuramente sulla bash e probabilmente su quelle POSIX.
Bourne shell (sh) probabilmente no, anzi dubito assai.
P.S. Poi non riesco neanche a capire quanto possa essere un problema di shell, semmai di grep dato che è a lui che affido il compitino
Hai ragione, scusa mia imprecisione.
GNU bash e GNU grep hanno la stessa sintassi per le RE.
Altri UNIX no, quindi badare alla portabilita`.

Mario Vanoni

Re: [bash] pipe con output in colonne

Inviato: gio 14 feb 2008, 23:52
da urka58
Questo è leggermente più leggibile di un comando sed...

Codice: Seleziona tutto

 grep [[:digit:]]% $input_file | awk '{print $NF}' | grep -o "[0-9]\{1,3\}" | sort -n | tail -1
Ciao

Re: [bash] pipe con output in colonne

Inviato: ven 15 feb 2008, 10:14
da targzeta
urka58 ha scritto:Questo è leggermente più leggibile di un comando sed...

Codice: Seleziona tutto

 grep [[:digit:]]% $input_file | awk '{print $NF}' | grep -o "[0-9]\{1,3\}" | sort -n | tail -1
Ciao
E dalli con la leggibilità, è soggettiva!!!
Per te è più leggibile questo, per me sono leggibili entrambi, con la differenza che tu lanci 5 comandi, io solo uno :).

Spina

Re: [bash] pipe con output in colonne

Inviato: ven 15 feb 2008, 12:11
da urka58
E dalli con la leggibilità, è soggettiva!!!
La leggibilità di uno script o di un comando non è soggettiva come l'interpretazione di un'opera d'arte. Dipende dal livello di conoscenza di chi si accinge ad scrivere/eseguire un comando o uno script.
Se qualcuno non ha una approfondita conoscenza in materia, a mio avviso è preferibile minore "sintesi" a favore di una maggiore semplicità o se preferisci maggiore interpretabilità.
Proporre una soluzione "complicata" ai più, lasciando all'interessato il compito di leggersi la pagina man per l'interpretazione ...non è l'approccio che preferisco.
Per te è più leggibile questo, per me sono leggibili entrambi, con la differenza che tu lanci 5 comandi, io solo uno
=D> =D>

Non è in discussione la tua abilità.. sei bravo, non devi dimostrare niente.

Ciao