Repository 32bit  Forum
Repository 64bit  Wiki

[bash] pipe con output in colonne

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

[bash] pipe con output in colonne

Messaggioda danix » ven feb 01, 2008 22:25

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
Avatar utente
danix
Staff
Staff
 
Messaggi: 3280
Iscritto il: ven ott 27, 2006 18:32
Località: Siderno (RC)
Nome Cognome: Danilo M.
Slackware: 64 14.0
Kernel: 3.2.29
Desktop: fluxbox

Re: [bash] pipe con output in colonne

Messaggioda stan » ven feb 01, 2008 22:39

Non so se ho capito bene...ma non puoi mandare l'output in pipe a tail?
Avatar utente
stan
Linux 2.6
Linux 2.6
 
Messaggi: 524
Iscritto il: lun dic 25, 2006 11:55
Località: Bs
Slackware: 12.1
Kernel: 2.6.xx
Desktop: Kde3

Re: [bash] pipe con output in colonne

Messaggioda Mario Vanoni » ven feb 01, 2008 22:40

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
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: [bash] pipe con output in colonne

Messaggioda targzeta » ven feb 01, 2008 22:53

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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6168
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: [bash] pipe con output in colonne

Messaggioda Mario Vanoni » ven feb 01, 2008 23:14

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
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: [bash] pipe con output in colonne

Messaggioda targzeta » ven feb 01, 2008 23:21

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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6168
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: [bash] pipe con output in colonne

Messaggioda danix » sab feb 02, 2008 1:21

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 :)
Avatar utente
danix
Staff
Staff
 
Messaggi: 3280
Iscritto il: ven ott 27, 2006 18:32
Località: Siderno (RC)
Nome Cognome: Danilo M.
Slackware: 64 14.0
Kernel: 3.2.29
Desktop: fluxbox

Re: [bash] pipe con output in colonne

Messaggioda sixjan » sab feb 02, 2008 8:50

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
sixjan
Linux 2.4
Linux 2.4
 
Messaggi: 407
Iscritto il: dom gen 06, 2008 11:46
Slackware: 14.1
Kernel: 3.10.17-smp
Desktop: Xfce 4.10

Re: [bash] pipe con output in colonne

Messaggioda targzeta » sab feb 02, 2008 9:46

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;'
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6168
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: [bash] pipe con output in colonne

Messaggioda danix » sab feb 02, 2008 10:24

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...
Avatar utente
danix
Staff
Staff
 
Messaggi: 3280
Iscritto il: ven ott 27, 2006 18:32
Località: Siderno (RC)
Nome Cognome: Danilo M.
Slackware: 64 14.0
Kernel: 3.2.29
Desktop: fluxbox

Re: [bash] pipe con output in colonne

Messaggioda targzeta » sab feb 02, 2008 10:31

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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6168
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: [bash] pipe con output in colonne

Messaggioda Mario Vanoni » sab feb 02, 2008 14:24

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
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: [bash] pipe con output in colonne

Messaggioda urka58 » gio feb 14, 2008 23:52

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
Avatar utente
urka58
Linux 2.6
Linux 2.6
 
Messaggi: 536
Iscritto il: mer dic 07, 2005 23:29

Re: [bash] pipe con output in colonne

Messaggioda targzeta » ven feb 15, 2008 10:14

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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6168
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: [bash] pipe con output in colonne

Messaggioda urka58 » ven feb 15, 2008 12:11

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
Avatar utente
urka58
Linux 2.6
Linux 2.6
 
Messaggi: 536
Iscritto il: mer dic 07, 2005 23:29

Prossimo

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti

cron