[bash] cerca string in file contenuto in ogni directory [ris]

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
daniele50
Linux 3.x
Linux 3.x
Messaggi: 964
Iscritto il: mar 10 apr 2007, 13:58
Nome Cognome: Daniele Cinquanta
Slackware: Slackware64 14.1
Kernel: 3.10.17
Desktop: Xfce 4.10
Località: San Zenone al Lambro (MI)
Contatta:

[bash] cerca string in file contenuto in ogni directory [ris]

Messaggio da daniele50 »

Ciao,
ho una serie di directory, all'interno di alcune di esse c'è un file, quando c'è devo estrapolare delle stringhe da questo file.

In sostanza dovrebbe essere così:

Codice: Seleziona tutto

- creo un ciclo e per ogni directory che trovo:
  - controllo se c'è un determinato file appl'interno
    - apro il file ed estraggo delle stringhe
- concludo il cliclo e passo alla directory successiva
per il momento sono permo al primo punto: creare un ciclo per ogni directory...
Ultima modifica di daniele50 il mer 9 nov 2011, 16:53, 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] ricerca stringa in un file contenuto in ogni cart

Messaggio da targzeta »

Ci devi dare altre info, così non si capisce molto. Cosa devi estrapolare? Lo vuoi fare con l'editing al volo oppure vuoi editare a mano tutti i file? La struttura della directory com'è? I file stanno nel secondo livello dalla directory "madre" oppure possono stare in un qualsiasi sottolivello? Se la struttura è questa:

Codice: Seleziona tutto

.
 dir1/
 dir1/mio_file
 dir2/
 dir3/
 dir3/mio_file
...
Ti basta fare:

Codice: Seleziona tutto

for file in */mio_file
 do
  quello_che_ci_devi_fare_su file
done
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
daniele50
Linux 3.x
Linux 3.x
Messaggi: 964
Iscritto il: mar 10 apr 2007, 13:58
Nome Cognome: Daniele Cinquanta
Slackware: Slackware64 14.1
Kernel: 3.10.17
Desktop: Xfce 4.10
Località: San Zenone al Lambro (MI)
Contatta:

Re: [bash] ricerca stringa in un file contenuto in ogni cart

Messaggio da daniele50 »

Mi spiego meglio, la struttura è questa:

Codice: Seleziona tutto

..
dir1/dir/dir/miofile
dir2
dir3/dir/dir/miofile
dir4/dir/dir/miofile
dir5
..
se c'è il file miofile mi server sapere in quale dir sono (dir1, dir2, ecc) e poi dovro estrarre delle stringhe dal contenuto di miofile.
Come estrarre parti del contenuto dei file ci penso in seconda istanza...

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] ricerca stringa in un file contenuto in ogni cart

Messaggio da targzeta »

Allora fai:

Codice: Seleziona tutto

for file in */*/*/miofile
do
dirname=${file%%/*}
...
done
così in dirname hai il nome della directory in cui è contenuto il file. Però se ti ostini a non dirci cosa devi estrapolare non possiamo dirti come :).

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

Avatar utente
daniele50
Linux 3.x
Linux 3.x
Messaggi: 964
Iscritto il: mar 10 apr 2007, 13:58
Nome Cognome: Daniele Cinquanta
Slackware: Slackware64 14.1
Kernel: 3.10.17
Desktop: Xfce 4.10
Località: San Zenone al Lambro (MI)
Contatta:

Re: [bash] ricerca stringa in un file contenuto in ogni cart

Messaggio da daniele50 »

Eccomi, volevo procedere per gradi, lo script funziona:

Codice: Seleziona tutto

#!/bin/sh

for file in */WEB-INF/classes/DBConfig
do
  dirname=${file%%/*}
  echo $dirname
done
così vedo tutte le directory che contengono il file WEB-INF/classes/DBConfig

ecco com'è fatto il file DBConfig:

JDBCConnectionURL.1=jdbc:sqlserver://NomeServer:1433;DatabaseName=NomeDatabase
JDBCDriver.1=com.microsoft.sqlserver.jdbc.SQLServerDriver
UserName.1=Utente
Password.1=Password
Instance.1=SERVLET
DefaultUserTimeout=3600


in alcuni casi però il la prima riga è così:

JDBCConnectionURL.1=jdbc:sqlserver://NomeServer:1433;DatabaseName=NomeDatabase;sendStringParametersAsUnicode=false;selectMethod=cursor

mentre le successive sono uguali.
Devo catturare le parti in grassetto...

notsafe
Linux 2.x
Linux 2.x
Messaggi: 451
Iscritto il: mar 21 mar 2006, 11:00

Re: [bash] ricerca stringa in un file contenuto in ogni cart

Messaggio da notsafe »

per catturare le due stringe dal file

Codice: Seleziona tutto

SERVERNAME=$(grep JDBCConnectionURL $NOMEFILE|awk -F/ '{ print $3 }' | awk -F: '{ print $1 }')
DBNAME=$(grep JDBCConnectionURL $NOMEFILE|awk -F/ '{ print $3 }' | awk -F= '{ print $1 }'|  awk -F\; '{ print $2 }')

echo $SERVERNAME
echo $DBNAME

Avatar utente
daniele50
Linux 3.x
Linux 3.x
Messaggi: 964
Iscritto il: mar 10 apr 2007, 13:58
Nome Cognome: Daniele Cinquanta
Slackware: Slackware64 14.1
Kernel: 3.10.17
Desktop: Xfce 4.10
Località: San Zenone al Lambro (MI)
Contatta:

Re: [bash] ricerca stringa in un file contenuto in ogni cart

Messaggio da daniele50 »

Questo è il file:

Codice: Seleziona tutto

JDBCConnectionURL.1=jdbc:sqlserver://192.168.1.1:1433;DatabaseName=SQL12345
JDBCDriver.1=com.microsoft.sqlserver.jdbc.SQLServerDriver
UserName.1=Utente
Password.1=Password
Instance.1=SERVLET
DefaultUserTimeout=3600
Questo è il risultato che mi da lo script di notsafe:

Codice: Seleziona tutto

192.168.1.1
DatabaseName
Il nome server è corretto ma il nome database no, awk non lo conosco, sto cercando non è semplice... per me...

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] ricerca stringa in un file contenuto in ogni cart

Messaggio da targzeta »

Andare per gradi è l'approccio corretto, però noi ti possiamo aiutare solo quando abbiamo tempo :). Se ci avessi detto fin da subito cosa volevi estrapolare avresti già avuto il tuo bellissimo script.

Capisco che è un commento sterile il mio. Più tardi ti posto cosa avrei fatto.

@notsafe. Mi sa che devi prelevargli anche il nume utente e la password.

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

Avatar utente
daniele50
Linux 3.x
Linux 3.x
Messaggi: 964
Iscritto il: mar 10 apr 2007, 13:58
Nome Cognome: Daniele Cinquanta
Slackware: Slackware64 14.1
Kernel: 3.10.17
Desktop: Xfce 4.10
Località: San Zenone al Lambro (MI)
Contatta:

Re: [bash] ricerca stringa in un file contenuto in ogni cart

Messaggio da daniele50 »

Hai ragione, accetto l'aiuto che potete darmi senza polemizzare e chiarisco un paio di cose:
- come dici tu ho bisogno anche user e password
- come detto nel mio precedente post il nome database è errato

Grazie per l'aiuto che offrite!

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] ricerca stringa in un file contenuto in ogni cart

Messaggio da targzeta »

Non ti preoccupare, l'ho già detto che era un commento sterile. Ecco come farei io:

Codice: Seleziona tutto

#!/bin/sh

for file in */WEB-INF/classes/DBConfig
do
  dirname=${file%%/*}
  infos=( $(sed -n '/^JDBCConnectionURL/{s/.*:\/\/\([^:]*\).*DatabaseName=\([^;]*\);\?.*/\1 \2/;p};/^UserName/b get_value;/^Password/b get_value;d;:get_value s/.*=\(.*\)/\1/;p' $file) )
  echo "$dirname ${infos[0]} ${infos[1]} ${infos[2]} ${infos[3]}"
done
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

notsafe
Linux 2.x
Linux 2.x
Messaggi: 451
Iscritto il: mar 21 mar 2006, 11:00

Re: [bash] ricerca stringa in un file contenuto in ogni cart

Messaggio da notsafe »

sorry
correggi con questo:

Codice: Seleziona tutto

DBNAME=$(grep JDBCConnectionURL $NOMEFILE|awk -F/ '{ print $3 }' |  awk -F= '{ print $2 }'|  awk -F\; '{ print $1 }')

da un test dovrebbe darti la stringa corretta:

Codice: Seleziona tutto

echo "JDBCConnectionURL.1=jdbc:sqlserver://192.168.1.1:1433;DatabaseName=SQL12345"| awk -F/ '{ print $3 }' |  awk -F= '{ print $2 }'|  awk -F\; '{ print $1 }'
SQL12345
per user e password...puoi continuare a giocare con awk (se ti diciamo tutto..che divertimento c'è nel creare uno script? :))

UPDATE:
direi che la soluzione di spina è ben più elegante :)

Avatar utente
daniele50
Linux 3.x
Linux 3.x
Messaggi: 964
Iscritto il: mar 10 apr 2007, 13:58
Nome Cognome: Daniele Cinquanta
Slackware: Slackware64 14.1
Kernel: 3.10.17
Desktop: Xfce 4.10
Località: San Zenone al Lambro (MI)
Contatta:

Re: [bash] ricerca stringa in un file contenuto in ogni cart

Messaggio da daniele50 »

Risultato dell script di notsafe:

Codice: Seleziona tutto

192.168.1.1
SQL12345
Mancano user e password ma il resto è giusto.

Risultato dell script di spina:

Codice: Seleziona tutto

 Pas12345ow 192.168.1.1 SQL12345
Ci sono quasi tutti i parametri l'utente no (e poi c'è 'ow' dopo l'utente...)

Mi rendo conto che di espressioni non so proprio nulla :cry:
Ultima modifica di daniele50 il mer 9 nov 2011, 16:24, 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] ricerca stringa in un file contenuto in ogni cart

Messaggio da targzeta »

Guarda che lo script che ho fatto era in continua modifica :). Ora dovrebbe essere corretto. Non so quando lo hai testato tu.

Codice: Seleziona tutto

tree
.
|-- dir1
|   `-- casa
|-- dir2
|-- dir3
|   `-- casa
Il contenuto dei due file 'casa' è esattamente quello che hai postato tu prima.

Codice: Seleziona tutto

for file in */casa
do
  dirname=${file%%/*}
  infos=( $(sed -n '/^JDBCConnectionURL/{s/.*:\/\/\([^:]*\).*DatabaseName=\([^;]*\);\?.*/\1 \2/;p};/^UserName/b get_value;/^Password/b get_value;d;:get_value s/.*=\(.*\)/\1/;p' $file) )
  echo "$dirname ${infos[0]} ${infos[1]} ${infos[2]} ${infos[3]}"
done
dir1 NomeServer NomeDatabase Utente Password
dir3 NomeServer NomeDatabase Utente Password
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
daniele50
Linux 3.x
Linux 3.x
Messaggi: 964
Iscritto il: mar 10 apr 2007, 13:58
Nome Cognome: Daniele Cinquanta
Slackware: Slackware64 14.1
Kernel: 3.10.17
Desktop: Xfce 4.10
Località: San Zenone al Lambro (MI)
Contatta:

Re: [bash] ricerca stringa in un file contenuto in ogni cart

Messaggio da daniele50 »

... vedi post precedente che ho modificato ...
Ultima modifica di daniele50 il mer 9 nov 2011, 16:35, 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] ricerca stringa in un file contenuto in ogni cart

Messaggio da targzeta »

Puoi postare il file sotto esame? Ovviamente modifica pure i dati sensibili.

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

Rispondi