[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.
Avatar utente
danix
Staff
Staff
Messaggi: 3287
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 5.4.43 x86_64
Desktop: i3
Località: Siderno (RC)
Contatta:

[bash] pipe con output in colonne

Messaggio 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
danix
myself ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

Avatar utente
stan
Linux 3.x
Linux 3.x
Messaggi: 524
Iscritto il: lun 25 dic 2006, 11:55
Slackware: 12.1
Kernel: 2.6.xx
Desktop: Kde3
Località: Bs

Re: [bash] pipe con output in colonne

Messaggio da stan »

Non so se ho capito bene...ma non puoi mandare l'output in pipe a tail?

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: [bash] pipe con output in colonne

Messaggio 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

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6628
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [bash] pipe con output in colonne

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: [bash] pipe con output in colonne

Messaggio 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

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6628
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [bash] pipe con output in colonne

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
danix
Staff
Staff
Messaggi: 3287
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 5.4.43 x86_64
Desktop: i3
Località: Siderno (RC)
Contatta:

Re: [bash] pipe con output in colonne

Messaggio 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 :)
danix
myself ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

sixjan
Linux 2.x
Linux 2.x
Messaggi: 413
Iscritto il: dom 6 gen 2008, 11:46
Slackware: 14.1
Kernel: 3.10.17-smp
Desktop: Xfce 4.10

Re: [bash] pipe con output in colonne

Messaggio 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

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6628
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [bash] pipe con output in colonne

Messaggio 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;'
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
danix
Staff
Staff
Messaggi: 3287
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 5.4.43 x86_64
Desktop: i3
Località: Siderno (RC)
Contatta:

Re: [bash] pipe con output in colonne

Messaggio 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...
danix
myself ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6628
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [bash] pipe con output in colonne

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: [bash] pipe con output in colonne

Messaggio 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

Avatar utente
urka58
Linux 3.x
Linux 3.x
Messaggi: 543
Iscritto il: mer 7 dic 2005, 23:29

Re: [bash] pipe con output in colonne

Messaggio 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

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6628
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [bash] pipe con output in colonne

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
urka58
Linux 3.x
Linux 3.x
Messaggi: 543
Iscritto il: mer 7 dic 2005, 23:29

Re: [bash] pipe con output in colonne

Messaggio 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

Rispondi