[RISOLTO] [Bash Scripting] Quesito su cat

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.
Rispondi
Avatar utente
Savius
Linux 3.x
Linux 3.x
Messaggi: 553
Iscritto il: gio 14 ago 2008, 13:45
Slackware: Slackware64 14.0
Kernel: 3.2.29-smp
Desktop: KDE 4.8.5
Località: Napoli

[RISOLTO] [Bash Scripting] Quesito su cat

Messaggio da Savius »

Salve a tutti,
sono ore che sto smanettando con un semplicissimo script che ho scritto ma, ahimé, non sono ancora riuscito a capire quale sia l'errore.
Lo script in questione dovrebbe eseguire la seguente operazione: leggere da una directory tutti i file con estensione .jar e, per ogni parola contenuta nel file "prova.txt", deve effettuare un grep per verificare se la parola è contenuta in uno di quei file jar.

Esempio:
grep -i parola file.jar

la parola non è sempre la stessa perché viene presa da un file (prova.txt) che contiene una lista di parole, e i file jar sono abbastanza. Lo script che ho elaborato dovrebbe automatizzare il processo perché con il primo ciclo for salva nella variabile file i singoli file jar che trova nella directory e con il secondo ciclo for salvo nella variabile arg le singole parole contenute nel file di testo prova.txt. Il problema sembrerebbe esser dovuto al contenuto di arg: se inserisco un echo $arg in output noto che la variabile contiene di volta in volta le parole prese dalla lista. Ma se provo a sostituire a quell'echo quest'altro echo $arg e $file non mi visualizza il valore di arg e, quando lo fa, spesso lo spezzetta e unisce i caratteri alla fine della parola restituita da file. Non so se ho reso bene l'idea, nel caso cercherò di spiegarmi meglio.

Di seguito vi posto il codice del mio script:

Codice: Seleziona tutto

#!/bin/sh

for file in `ls *.jar` 
do
	for arg in `cat prova.txt` 
	do
		grep -i $arg $file
	done
done

exit 0;
Sapreste dirmi dov'è l'errore ed, eventualmente, come risolverlo?
Ultima modifica di Savius il gio 27 ott 2011, 14:59, modificato 1 volta in totale.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6629
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 Scripting] Quesito su cat

Messaggio da targzeta »

Posta anche un esempio di cui parli. Quello in cui fai l'echo e succede casino. Così magari si capisce meglio quello che vuoi dire. Quano dici:"se inserisco un echo $arg in output noto che la variabile contiene di volta in volta le parole prese dalla lista" vuoi dire che si comporta come dovrebbe?

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
Savius
Linux 3.x
Linux 3.x
Messaggi: 553
Iscritto il: gio 14 ago 2008, 13:45
Slackware: Slackware64 14.0
Kernel: 3.2.29-smp
Desktop: KDE 4.8.5
Località: Napoli

Re: [Bash Scripting] Quesito su cat

Messaggio da Savius »

Ciao spina,
grazie per la risposta. Mi spiego meglio e ti faccio qualche esempio; quando dicevo: "fa quello che deve fare" non mi riferivo che funzionava tutto ma che, almeno il valore della variabile arg, veniva preso in maniera corretta.

Se nello script precedente inserisco un echo $arg, noterò una serie di stampe relative alle parole che di volta in volta vengono memorizzate in arg e che sono prese dal file prova.txt. Se sostituisco quell'echo ad esempio a quest'altro: echo "Argomento: $arg e File: $file" ottengo
e File: plutouto.jar
e File: plutolu.jar
e File: plutop.jar
e File: plutoto.jar
e File: plutout.jar
e File: plutop.jar
e File: plutoo.jar
Argomento: pippo e File: pluto
e File: paperinope.jar
e File: paperinor.jar
e File: paperinono.jar
e File: paperinoi.jar
e File: paperinori.jar
e File: paperinop.jar
e File: paperinoap.jar
ho inserito in grassetto le parti spezzettate del testo e dove vengono inserite.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6629
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 Scripting] Quesito su cat

Messaggio da targzeta »

Vediamo se ho capito bene.

Codice: Seleziona tutto

$> cat script.sh 
#!/bin/sh

for file in `ls *.jar`
do
   for arg in `cat prova.txt`
   do
       echo "Argomento: $arg e File: $file"
   done
done

exit 0

Codice: Seleziona tutto

$> ls -1 *jar
1.jar
2.jar
3.jar

Codice: Seleziona tutto

$> cat prova.txt 
pluto
pippo
minni

Codice: Seleziona tutto

$>  sh script.sh 
Argomento: pluto e File: 1.jar
Argomento: pippo e File: 1.jar
Argomento: minni e File: 1.jar
Argomento: pluto e File: 2.jar
Argomento: pippo e File: 2.jar
Argomento: minni e File: 2.jar
Argomento: pluto e File: 3.jar
Argomento: pippo e File: 3.jar
Argomento: minni e File: 3.jar
Questa esecuzione è corretta? A te questo stesso script con questi stessi file da problemi?

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
Savius
Linux 3.x
Linux 3.x
Messaggi: 553
Iscritto il: gio 14 ago 2008, 13:45
Slackware: Slackware64 14.0
Kernel: 3.2.29-smp
Desktop: KDE 4.8.5
Località: Napoli

Re: [Bash Scripting] Quesito su cat

Messaggio da Savius »

Esatto, in pratica hai scritto il mio stesso codice ma senza il grep (che non funziona perché la variabile arg sembrerebbe non valorizzarsi bene). Solo che a me la stampa appare come ti ho postato in precedenza e non come quella indicata da te. :S

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6629
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 Scripting] Quesito su cat

Messaggio da targzeta »

Scusa, potresti rifare la prova usando gli stessi identici file che uso io e postare l'output? E' tutto lì, i file .jar sono vuoti.

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
Savius
Linux 3.x
Linux 3.x
Messaggi: 553
Iscritto il: gio 14 ago 2008, 13:45
Slackware: Slackware64 14.0
Kernel: 3.2.29-smp
Desktop: KDE 4.8.5
Località: Napoli

Re: [Bash Scripting] Quesito su cat

Messaggio da Savius »

Ciao spina,
scusa non avevo capito quel che mi chiedevi.

Ho fatto la prova che mi hai scritto e il risultato è identico a quello che hai postato tu:

Codice: Seleziona tutto

Argomento: pluto e File: 1.jar
Argomento: pippo e File: 1.jar
Argomento: minni e File: 1.jar
Argomento: pluto e File: 2.jar
Argomento: pippo e File: 2.jar
Argomento: minni e File: 2.jar
Argomento: pluto e File: 3.jar
Argomento: pippo e File: 3.jar
Argomento: minni e File: 3.jar
Adesso però non capisco quale sia la differenza con quel che ho scritto io e che non va... :S

Edit:
Credo di aver risolto, il problema era dovuto al tipo di file di testo.

Esempio:

Codice: Seleziona tutto

$ file prova_originale.txt
prova_originale.txt ASCII text, with CRLF line terminators

$ file prova_nuova.txt
prova_nuova.txt: ASCII text
In pratica il file di testo che stavo utilizzando aveva definiti dei terminatori particolari che nel file nuovo, creato con Vim, non ci sono. Rifacendo il test il tutto è andato a buon fine. Grazie mille per l'aiuto spina, mi hai illuminato! ^^

Avatar utente
masalapianta
Iper Master
Iper Master
Messaggi: 2775
Iscritto il: lun 25 lug 2005, 0:00
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian
Località: Roma
Contatta:

Re: [Bash Scripting] Quesito su cat

Messaggio da masalapianta »

per correggere i file con i terminatori di riga cr+lf (vengono creati da roba microsoft), puoi utilizzare il tool dos2unix

Avatar utente
Savius
Linux 3.x
Linux 3.x
Messaggi: 553
Iscritto il: gio 14 ago 2008, 13:45
Slackware: Slackware64 14.0
Kernel: 3.2.29-smp
Desktop: KDE 4.8.5
Località: Napoli

Re: [RISOLTO] [Bash Scripting] Quesito su cat

Messaggio da Savius »

Grazie masalapianta,
prima avevo direttamente rediretto il cat al file originale in un nuovo file così da ottenere al volo un file uguale ma senza quei terminatori. Il file originale però non è stato creato da Windows perché sto utilizzando sempre Slackware, è probabile che l'editor che stavo usando (Kwrite) salvasse i file txt direttamente con quei terminatori ecco perché, creandolo invece da Vim, il risultato era diverso.

Grazie comunque per la dritta, lo ricorderò nel caso in cui mi ricapitasse questo problema! :D

Rispondi