Pagina 1 di 2

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

Inviato: mer 9 nov 2011, 12:20
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...

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

Inviato: mer 9 nov 2011, 12:39
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

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

Inviato: mer 9 nov 2011, 13:18
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...

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

Inviato: mer 9 nov 2011, 13:23
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

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

Inviato: mer 9 nov 2011, 14:22
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...

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

Inviato: mer 9 nov 2011, 15:06
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

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

Inviato: mer 9 nov 2011, 15:41
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...

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

Inviato: mer 9 nov 2011, 15:42
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

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

Inviato: mer 9 nov 2011, 15:54
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!

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

Inviato: mer 9 nov 2011, 15:59
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

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

Inviato: mer 9 nov 2011, 16:01
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 :)

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

Inviato: mer 9 nov 2011, 16:12
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:

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

Inviato: mer 9 nov 2011, 16:15
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

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

Inviato: mer 9 nov 2011, 16:25
da daniele50
... vedi post precedente che ho modificato ...

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

Inviato: mer 9 nov 2011, 16:28
da targzeta
Puoi postare il file sotto esame? Ovviamente modifica pure i dati sensibili.

Emanuele