PDA

Visualizza la versione completa : Script bash: apertura e lettura da FILE


Smoke666
22-04-2012, 16:11
Ciao a tutti, sto realizzando uno script che deve leggere da un file (o un elenco di file) una sorta di "parola chiave", la quale è seguita da un valore. Devo sommare tutti questi valori presenti dopo la "parola chiave". Sto incontrando qualche problema, anche perchè è la prima volta che realizzo uno script in bash. Chiedo aiuto a voi! :D

Dunque, premetto che ho il divieto assoluto di usare sed e awk; avevo pensato di cercare la mia keyword con il comando grep, poi però non so come fare per leggere il valore che segue la mia keyword; ad esempio:

miofile.txt


..........
.........
.....
PIPPO 12
..........
.........
PIPPO 1




grep PIPPO -/miofile.txt


Ora ho individuato PIPPO, ma a me serve il valore che c'è dopo di lui...Come faccio a prelevarlo? E inoltre, per trovare eventuali altri PIPPO all'interno del file, devo invocare la grep in un ciclo che ha come condizione di uscita cosa?

Grazie a tutti in anticipo! :unz:

psykopear
22-04-2012, 18:11
Originariamente inviato da Smoke666
Ciao a tutti, sto realizzando uno script che deve leggere da un file (o un elenco di file) una sorta di "parola chiave", la quale è seguita da un valore. Devo sommare tutti questi valori presenti dopo la "parola chiave". Sto incontrando qualche problema, anche perchè è la prima volta che realizzo uno script in bash. Chiedo aiuto a voi! :D

Dunque, premetto che ho il divieto assoluto di usare sed e awk; avevo pensato di cercare la mia keyword con il comando grep, poi però non so come fare per leggere il valore che segue la mia keyword; ad esempio:

miofile.txt


..........
.........
.....
PIPPO 12
..........
.........
PIPPO 1




grep PIPPO -/miofile.txt


Ora ho individuato PIPPO, ma a me serve il valore che c'è dopo di lui...Come faccio a prelevarlo? E inoltre, per trovare eventuali altri PIPPO all'interno del file, devo invocare la grep in un ciclo che ha come condizione di uscita cosa?

Grazie a tutti in anticipo! :unz:

vediti il man di cut, nel tuo caso per estrarre il numero messo dopo lo spazio dovresti fare tipo

grep PIPPO -/miofile.txt | cut -d" " -f2

per sommarli usi let

Smoke666
23-04-2012, 10:38
Grazie per la risposta! Volevo anche chiederti se era lecito fare una cosa del genere:


exec > $1 | grep -i -q PIPPO | let $count+=[cut -d" " -f 2]

Ovvero reindirizzo lo stdout e il comando grep lo invoco senza il percorso del file... Inoltre grep trova solo la prima occorrenza della parola o tutte le occorrenze? Non l'ho trovato da nessuna parte..Grazie in anticipo mi sei stato utilissimo! :D :D :D


Edit: Dimenticavo di esplicitare che eseguo exec >$1 perchè il file lo passo come parametro!

psykopear
25-04-2012, 14:58
Originariamente inviato da Smoke666
Grazie per la risposta! Volevo anche chiederti se era lecito fare una cosa del genere:


exec > $1 | grep -i -q PIPPO | let $count+=[cut -d" " -f 2]

Ovvero reindirizzo lo stdout e il comando grep lo invoco senza il percorso del file... Inoltre grep trova solo la prima occorrenza della parola o tutte le occorrenze? Non l'ho trovato da nessuna parte..Grazie in anticipo mi sei stato utilissimo! :D :D :D


Edit: Dimenticavo di esplicitare che eseguo exec >$1 perchè il file lo passo come parametro!

Provalo :D Comunque dovrebbe essere così

for i in `cat $1 | grep -i -q PIPPO | cut -d" " -f 2`
do
let $count+=$i
done

con il for la i assume ad ogni ciclo uno dei valori che ti tiri fuori con la stringa (vediti come funzionano gli apici rovesciati `) e li somma uno per uno a $count

edit: la tua stringa non funziona perchè gli chiedi di eseguire il file che vuoi visualizzare, quindi metti cat prima, che ti permette appunto di mandare in stdout il contenuto del file, lo mandi a grep che ti trova TUTTE le righe che contengono PIPPO, e l'output di grep lo reindirizzi a cut che ti prende solo i valori di cui hai bisogno e li manda in stdout uno per riga (se il file è fatto come hai spiegato te nel primo post), il ciclo for legge una riga per volta e la aggiunge a $count. Volendo potresti mettere un controllo sul fatto che $i sia un numero o meno, ma quello dipende da cosa devi fare con lo script, se sei sicuro che il file $1 sia fatto bene non ce n'è bisogno.

Smoke666
25-04-2012, 16:30
Ho optato per questa riga:



echo $((`grep -Po '(?<=PIPPO )[0-9]+' /tmp/s.txt | tr '\n' +`0))


Che stampa perfettamente il tutto ;-)

Loading