PDA

View Full Version : [Bash] Confrontare due stringhe


Zagor HW
16-01-2008, 12:20
Salve, dovrei prendere da /proc/cpuinfo il valore corrispondente ai bogomips di tutti i processori presenti nella macchina:


while read riga ; do
....
done < /proc/cpuinfo


In riga dovrebbe essere presente, ad ogni iterazione, una riga del file, ora come faccio a controllare la presenza della stringa "bogomips :", e prendere il valore numerico contenuto affianco?
Ho cercato qualche guida che mi aiutasse ma non sono riuscito a risolvere nulla, qualcuno potrebbe aiutarmi?

Grazie

vizzz
16-01-2008, 12:30
Salve, dovrei prendere da /proc/cpuinfo il valore corrispondente ai bogomips di tutti i processori presenti nella macchina:


while read riga ; do
....
done < /proc/cpuinfo


In riga dovrebbe essere presente, ad ogni iterazione, una riga del file, ora come faccio a controllare la presenza della stringa "bogomips :", e prendere il valore numerico contenuto affianco?
Ho cercato qualche guida che mi aiutasse ma non sono riuscito a risolvere nulla, qualcuno potrebbe aiutarmi?

Grazie

bogomips=`cat /proc/cpuinfo | egrep -i '^bogomips' | head -1 | sed 's/^.*: //'`

Zagor HW
16-01-2008, 19:07
Ok, ti ringrazio. Una cosa sola, se metto quella riga di codice nel ciclo, salva solo il primo valore che incontro. Nel caso nel file ci siano più voci "bogomips", considera solo il primo che trova. Come si potrebbe risolvere?

kingv
16-01-2008, 23:10
Ok, ti ringrazio. Una cosa sola, se metto quella riga di codice nel ciclo, salva solo il primo valore che incontro. Nel caso nel file ci siano più voci "bogomips", considera solo il primo che trova. Come si potrebbe risolvere?

combina il suo codice col tuo :

cat /proc/cpuinfo | egrep -i '^bogomips' sed 's/^.*: //' | while read riga ; do quel_che_vuoi; done

Zagor HW
17-01-2008, 18:53
combina il suo codice col tuo :

cat /proc/cpuinfo | egrep -i '^bogomips' sed 's/^.*: //' | while read riga ; do quel_che_vuoi; done

Ok, grazie mille, così ora funziona. Avrei ancora una domanda sul funzionamento in generale dello script:

Con cat /proc/cpuinfo leggiamo il file giusto?

Con | egrep -i '^bogomips' nel file appena letto cerchiamo la parola bogomips, o sbaglio? (perché è stato introdotto il carattere ^ per rinviare ad inizio riga?)

Infine questo frammento di codice sed 's/^.*: //'
che operazione esegue nello specifico?

vizzz
17-01-2008, 19:11
con grep selezioni solo la riga che riguarda i bogomips e con sed sostituisci tutto il testo prima dei ":" -> "^.*: " con niente.

kingv
17-01-2008, 19:13
con cat lo "mandiamo" verso lo standard output

il pattern di egrep ha l'accento circonflesso per fare il matching solo se la parola bogomips appare a inizio riga (funzionerebbe ugualmente nel caso specifico ma è una buona abitudine).

il sed sostituisce tutto quello che va da inizio riga a un duepunti seguito da uno spazio ( ": ") con .... niente, ovvero lo cancella lasciando solo valore numerico.

Zagor HW
17-01-2008, 22:33
Ok, vediamo se ho capito allora:

s/ <- sta per "sostituisci"
^.*: <- sta per "da inizio riga fino ai :"
// <- sta per "sostituisci con 'niente'"

è giusta questa lettura?

Questa stessa espressione (sed 's/^.*: //') come sarebbe diventata se avessi voluto sostituire con "nulla", da un determinato carattere (per esempio un punto) posto in mezzo ad una stringa, fino alla fine della riga stessa?

kingv
18-01-2008, 08:28
è giusta questa lettura?






Questa stessa espressione (sed 's/^.*: //') come sarebbe diventata se avessi voluto sostituire con "nulla", da un determinato carattere (per esempio un punto) posto in mezzo ad una stringa, fino alla fine della riga stessa?

sed 's/\..*//' (dal primo punto alla fine riga)

Zagor HW
18-01-2008, 10:15
Ok, grazie mille a tutti! Ora ho risolto il mio problema. Ciao Ciao!