Notizia:
  • Rilasciata Precise Pangolin 12.04. Per ottenerla, visitate questa pagina, oppure provate il tour dal vivo con un browser web moderno.
  • Nuovo forum di Ubuntu-it, l'annuncio. È consigliato aggiornare il proprio profilo e controllare la sezione Gruppo Forum per problemi noti.
  • Rilasciata la versione italiana di Precise Pangolin 12.04. Per maggiori informazioni, consultare questa discussione.
  • Il vincitore del Concorso desktop del mese di aprile è Jerico. L'elenco dei precedenti vincitori è qui.
  • È uscito il numero 17 della Newsletter italiana di Ubuntu. Lo trovate a questo indirizzo.
  • È uscito il numero 59 di Full Circle Magazine in italiano. Lo trovate a questo indirizzo.

[Risolto] [Bash] Inserire e cancellare utenti da file di configurazione

Linguaggi di programmazione: php, perl, python, C, bash, ecc.

Re: [Bash] Inserire e cancellare utenti da file di configurazione

Messaggioda mikecesure » martedì 7 febbraio 2012, 17:31

Utenti: caratteri alfanumerici significa che sono solamente numeri o lettere ( "[" non è un carattere alfanumerico quindi non ci sarà nessun utente che nome che inizia per [ )

Se un progetto contiene un solo utente, desidero che questo non venga cancellato.  (yes)

Per il resto attendo  :)
mikecesure
Prode Principiante
 
Messaggi: 186
Iscrizione: ottobre 2009

Re: [Bash] Inserire e cancellare utenti da file di configurazione

Messaggioda l3on4rdo » martedì 7 febbraio 2012, 17:36

Ok, scusa per le millemila domande.
Stasera cerco di modificare la parte per la rimozione e ti posto il codice.

ciao
Come da regolamento, UNA DISCUSSIONE, PER OGNI PROBLEMA, DOPO aver verificato, con UNA RICERCA, che non sia stato già trattato.
E, prima di sparire con la soluzione, ricorda di mettere [Risolto] nel titolo del primo messaggio della discussione.
La vendetta è un piatto da consumare freddo. Per questo hanno inventato il freezer.
Avatar utente
l3on4rdo
Moderatore Globale
Moderatore Globale
 
Messaggi: 9705
Iscrizione: maggio 2008
Località: Roma
Distribuzione: Ubuntu 10.04.4 e 12.04 64bit
Desktop: Gnome

Re: [Bash] Inserire e cancellare utenti da file di configurazione

Messaggioda l3on4rdo » martedì 7 febbraio 2012, 19:19

Penso di aver risolto il problema della non eliminazione di un utente, quando questo è l'unico rimasto in un progetto.
Facciamo riferimento al file (che è lo stesso di prima, ma con il progetto 2 ridotto ad un solo utente):
Codice: Seleziona tutto
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/controllaUtenteProgetto$ cat esempio.txt
[progetto 1:/]
utente 1 = rw
utente 2 = rw
utente 3 = rw

[progetto 2:/]
utente 2 = rw

[progetto 3:/]
utente 1 = rw
utente 2 = rw
utente 3 = rw

[progetto 4:/]
utente 1 = rw
utente 2 = rw
utente 3 = rw



Per stampare con sed il contenuto di un file tra due parole (nel senso che inizi a stampare quando trovi una prima corrispondenza e interrompi la stampa quando trovi la seconda... ragionando sempre una riga alla volta come ragiona sed) puoi usare il comando:
Codice: Seleziona tutto
sed -ne '/match1/,/match2/p' path_del_file


Se quindi vuoi stampare le righe che ci sono tra [progetto 3:/] e la prima riga vuota (riga vuota, eventualmente con spazi... non si sa mai...), puoi scrivere:
Codice: Seleziona tutto
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/controllaUtenteProgetto$ sed -ne '/\[progetto 3/,/^[[:space:]]*$/p' esempio.txt
[progetto 3:/]
utente 1 = rw
utente 2 = rw
utente 3 = rw



A che pro?
Se hai un progetto con un solo utente, questo comando ti stampa a video tre righe.
Quindi per controllare che il progetto abbia un solo utente, devi semplicemente controllare (con il comando wc) di quante righe sia composto tale output.
In questo caso hai 3 utenti, quindi 5 righe:
Codice: Seleziona tutto
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/controllaUtenteProgetto$ sed -ne '/\[progetto 3/,/^[[:space:]]*$/p' esempio.txt | wc -l
5


Una volta compreso questo, ti basta modificare le cose in tal senso, ovvero fai prima il controllo da bash che il precedente comando non ti dia 3 come output (che vuol dire un solo utente). Se ti dà 3 informi ed esci, altrimenti procedi.
Ti conviene lasciare lo script in awk non modificato (per il momento), metterlo in una directory in cui metti anche uno script bash di controllo.

Per il momento, quindi hai lo script rimuovi.awk:
Codice: Seleziona tutto
BEGIN {
   while ((getline tmp) != 0)
      if (tmp != "["progetto":/]") {
         print tmp
      }
      else
         break
   print tmp
   while ((getline tmp) != 0)
      if (tmp !~ utente)
         print tmp
      else if (tmp !~ /\[*/) {
         break
      }
}

{
   print
}


e nella stessa directory metti lo script bash inserisciRimuoviUtente.sh:
Codice: Seleziona tutto
#! /bin/bash

project=$1
user=$2
fileName=$3

rows=`sed -ne "/\[$project/,/^[[:space:]]*$/p" esempio.txt | wc -l`

if [ $rows == 3 ]; then
   echo $project ha solo un utente
else
   awk -v progetto="$project" -v utente="$user" -f rimuovi.awk $fileName
fi


E quindi lo lanci così:
Codice: Seleziona tutto
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/controllaUtenteProgetto$ ./inserisciRimuoviUtente.sh "progetto 2" "utente 2" esempio.txt
progetto 2 ha solo un utente
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/controllaUtenteProgetto$ ./inserisciRimuoviUtente.sh "progetto 2" "utente 3" esempio.txt
progetto 2 ha solo un utente

Come puoi vedere ti informa che è rimasto un solo utente... ma non è che si cura se l'utente che vuoi rimuovere fa parte o meno del progetto.

Lo stesso, se inserisci un progetto che ha più di un utente.
Lo script ti elimina tale utente, se lo trova, altrimenti non ti dice nulla e ti stampa a video un file tale e quale a quello di input:
Codice: Seleziona tutto
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/controllaUtenteProgetto$ ./inserisciRimuoviUtente.sh "progetto 3" "utente 3" esempio.txt
[progetto 1:/]
utente 1 = rw
utente 2 = rw
utente 3 = rw

[progetto 2:/]
utente 2 = rw

[progetto 3:/]
utente 1 = rw
utente 2 = rw

[progetto 4:/]
utente 1 = rw
utente 2 = rw

l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/controllaUtenteProgetto$ ./inserisciRimuoviUtente.sh "progetto 3" "utente 1234" esempio.txt
[progetto 1:/]
utente 1 = rw
utente 2 = rw
utente 3 = rw

[progetto 2:/]
utente 2 = rw

[progetto 3:/]
utente 1 = rw
utente 2 = rw
utente 3 = rw

[progetto 4:/]
utente 1 = rw
utente 2 = rw
utente 3 = rw




Nota bene
Per il momento (cosa che non mi piace) se un parametro (che sia il nome del progetto, il nome dell'utente o il path del file) contiene spazi, lo devi passare "quotato" allo script bash di controllo.
Inoltre, cosa non da poco, tale modo di procedere funziona se e solo se i progetti sono separati da una riga vuota (o con spazi) e se dopo l'ultimo utente dell'ultimo progetto è presente sempre una riga vuota.

ps: fammi sapere se te gusta, che pensiamo all'inserimento.
Ultima modifica di l3on4rdo il martedì 7 febbraio 2012, 19:23, modificato 1 volta in totale.
Come da regolamento, UNA DISCUSSIONE, PER OGNI PROBLEMA, DOPO aver verificato, con UNA RICERCA, che non sia stato già trattato.
E, prima di sparire con la soluzione, ricorda di mettere [Risolto] nel titolo del primo messaggio della discussione.
La vendetta è un piatto da consumare freddo. Per questo hanno inventato il freezer.
Avatar utente
l3on4rdo
Moderatore Globale
Moderatore Globale
 
Messaggi: 9705
Iscrizione: maggio 2008
Località: Roma
Distribuzione: Ubuntu 10.04.4 e 12.04 64bit
Desktop: Gnome

Re: [Bash] Inserire e cancellare utenti da file di configurazione

Messaggioda mikecesure » martedì 7 febbraio 2012, 19:36

Mi va bene, logicamente farò in modo che ci sia una riga vuota anche dopo l'ultimo progetto (prima della fine del file per intenderci)..
Poi, per quanto riguarda le variabili, le ricavo da un read quindi il problema non sussiste, ma comunque sia utenti che progetti non hanno spazi nel nome  ;D

Per il momento mi pare un ottimo script, grazie ancora!!
mikecesure
Prode Principiante
 
Messaggi: 186
Iscrizione: ottobre 2009

Re: [Bash] Inserire e cancellare utenti da file di configurazione

Messaggioda l3on4rdo » martedì 7 febbraio 2012, 19:39

ma comunque sia utenti che progetti non hanno spazi nel nome

ah, già... caratteri alfanumerici :)

Per il momento mi pare un ottimo script

Questa è una tua opinione!  ;D
Quindi facciamo l'inserimento?

ps:
logicamente farò in modo che ci sia una riga vuota anche dopo l'ultimo progetto

Se è un problema, credo che non sia difficile aggiungere con sed una riga vuota alla fine del file se tale riga non è vuota.
Ultima modifica di l3on4rdo il martedì 7 febbraio 2012, 19:41, modificato 1 volta in totale.
Come da regolamento, UNA DISCUSSIONE, PER OGNI PROBLEMA, DOPO aver verificato, con UNA RICERCA, che non sia stato già trattato.
E, prima di sparire con la soluzione, ricorda di mettere [Risolto] nel titolo del primo messaggio della discussione.
La vendetta è un piatto da consumare freddo. Per questo hanno inventato il freezer.
Avatar utente
l3on4rdo
Moderatore Globale
Moderatore Globale
 
Messaggi: 9705
Iscrizione: maggio 2008
Località: Roma
Distribuzione: Ubuntu 10.04.4 e 12.04 64bit
Desktop: Gnome

Re: [Bash] Inserire e cancellare utenti da file di configurazione

Messaggioda l3on4rdo » martedì 7 febbraio 2012, 19:53

Mi stanno cacciando dalla biblioteca.
Qualora tu voglia procedere con l'inserimento, avrei alcune domande.
La prima che mi viene in mente è... ma gli utenti sono inseriti in ordine alfabetico, nei progetti?
... no vero? ;D

ciao
Come da regolamento, UNA DISCUSSIONE, PER OGNI PROBLEMA, DOPO aver verificato, con UNA RICERCA, che non sia stato già trattato.
E, prima di sparire con la soluzione, ricorda di mettere [Risolto] nel titolo del primo messaggio della discussione.
La vendetta è un piatto da consumare freddo. Per questo hanno inventato il freezer.
Avatar utente
l3on4rdo
Moderatore Globale
Moderatore Globale
 
Messaggi: 9705
Iscrizione: maggio 2008
Località: Roma
Distribuzione: Ubuntu 10.04.4 e 12.04 64bit
Desktop: Gnome

Re: [Bash] Inserire e cancellare utenti da file di configurazione

Messaggioda mikecesure » martedì 7 febbraio 2012, 20:55

no, nessun ordine alfabetico!! E logicamente bisogna verificare che non siano già presenti per quel progetto...
mikecesure
Prode Principiante
 
Messaggi: 186
Iscrizione: ottobre 2009

Re: [Bash] Inserire e cancellare utenti da file di configurazione

Messaggioda l3on4rdo » martedì 7 febbraio 2012, 23:37

mikecesure ha scritto:no, nessun ordine alfabetico!! E logicamente bisogna verificare che non siano già presenti per quel progetto...

La verifica è semplice.
Invece di contare le righe, nell'output di
Codice: Seleziona tutto
sed -ne '/\[progetto 3/,/^[[:space:]]*$/p' esempio.txt | wc -l

... fai un grep di "utente" :)

Sto procedendo a testare il codice, capo!
Per domani dovremmo aver concluso ;)

ciao
Come da regolamento, UNA DISCUSSIONE, PER OGNI PROBLEMA, DOPO aver verificato, con UNA RICERCA, che non sia stato già trattato.
E, prima di sparire con la soluzione, ricorda di mettere [Risolto] nel titolo del primo messaggio della discussione.
La vendetta è un piatto da consumare freddo. Per questo hanno inventato il freezer.
Avatar utente
l3on4rdo
Moderatore Globale
Moderatore Globale
 
Messaggi: 9705
Iscrizione: maggio 2008
Località: Roma
Distribuzione: Ubuntu 10.04.4 e 12.04 64bit
Desktop: Gnome

Re: [Bash] Inserire e cancellare utenti da file di configurazione

Messaggioda mikecesure » mercoledì 8 febbraio 2012, 0:22

domani purtroppo non ci sarò per la maggior parte del giorno, casomai ti rispondo giovedì!!

notte!!
mikecesure
Prode Principiante
 
Messaggi: 186
Iscrizione: ottobre 2009

Re: [Bash] Inserire e cancellare utenti da file di configurazione

Messaggioda l3on4rdo » mercoledì 8 febbraio 2012, 0:37

casomai ti rispondo giovedì!!

Faccia pure con comodo ;D

Scherzi a parte, al momento sto per rifare quanto fatto con awk per la rimozione, ma usando sed.
Alla fine è divertente.
L'inserimento è un po' più complesso e devo capire un paio di cose per bene, prima di procedere :)
Come da regolamento, UNA DISCUSSIONE, PER OGNI PROBLEMA, DOPO aver verificato, con UNA RICERCA, che non sia stato già trattato.
E, prima di sparire con la soluzione, ricorda di mettere [Risolto] nel titolo del primo messaggio della discussione.
La vendetta è un piatto da consumare freddo. Per questo hanno inventato il freezer.
Avatar utente
l3on4rdo
Moderatore Globale
Moderatore Globale
 
Messaggi: 9705
Iscrizione: maggio 2008
Località: Roma
Distribuzione: Ubuntu 10.04.4 e 12.04 64bit
Desktop: Gnome

Re: [Bash] Inserire e cancellare utenti da file di configurazione

Messaggioda l3on4rdo » mercoledì 8 febbraio 2012, 1:13

A parte il fatto che invece di rimuovere la riga la sostituisce con una riga vuota (nel senso che io non ci riesco), si può fare tutto l'ambaradam anche direttametne con sed.
Ad esempio, per eliminare da "progetto 3" "utente 2" puoi fare:
Codice: Seleziona tutto
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/controllaUtenteProgetto$ sed -e '/\[progetto 3/,/^[[:space:]]*$/s/utente 2.*//' esempio.txt
[progetto 1:/]
utente 1 = rw
utente 2 = rw
utente 3 = rw

[progetto 2:/]
utente 2 = rw

[progetto 3:/]
utente 1 = rw

utente 3 = rw

[progetto 4:/]
utente 1 = rw
utente 2 = rw
utente 3 = rw


Ovviamente devi comunque controllare che ci sia più di un utente, altrimenti te lo elimina

La "svolta" è che puoi usare l'opzione -i di sed per fare la modifica del file direttamente, senza appoggiarti ad un file di output temporaneo.
(o meglio, sed si appoggia ad un file temporaneo... ma fa tutto lui senza che ti ci sbatti tu)
Devo capire però come eliminare la riga e non sostituirla con una riga vuota :)
Ultima modifica di l3on4rdo il mercoledì 8 febbraio 2012, 1:30, modificato 1 volta in totale.
Come da regolamento, UNA DISCUSSIONE, PER OGNI PROBLEMA, DOPO aver verificato, con UNA RICERCA, che non sia stato già trattato.
E, prima di sparire con la soluzione, ricorda di mettere [Risolto] nel titolo del primo messaggio della discussione.
La vendetta è un piatto da consumare freddo. Per questo hanno inventato il freezer.
Avatar utente
l3on4rdo
Moderatore Globale
Moderatore Globale
 
Messaggi: 9705
Iscrizione: maggio 2008
Località: Roma
Distribuzione: Ubuntu 10.04.4 e 12.04 64bit
Desktop: Gnome

Re: [Bash] Inserire e cancellare utenti da file di configurazione

Messaggioda l3on4rdo » mercoledì 8 febbraio 2012, 4:28

Grazie al contributo di Zoff, ho risolto il fatto che non cancellava la riga ma la sostituiva con una riga vuota.
Si può quindi fare tutto in una botta usando solo sed
(non perché sia più veloce... ma perché in quel modo puoi evitare l'uso di uno script esterno e inoltre puoi usare l'opzione -i di sed per sovrascrivere il file di input)

Il comando è:
Codice: Seleziona tutto
if [ `sed -ne "/\[$progetto/,/^[[:space:]]*$/p" esempio.txt | wc -l` -gt 3 ]; then
    sed "/\[$progetto/,/^[[:space:]]*$/{/^$utente.*$/d;}" esempio.txt
else
    echo $progetto ha solo un utente
fi


'Sta chicca ti controlla se è l'unico utente rimasto. Se non è solo, te lo rimuove.
Ad esemprio:
Codice: Seleziona tutto
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/controllaUtenteProgetto$ progetto="progetto 3"
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/controllaUtenteProgetto$ utente="utente 2"
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/controllaUtenteProgetto$ if [ `sed -ne "/\[$progetto/,/^[[:space:]]*$/p" esempio.txt | wc -l` -gt 3 ]; then sed "/\[$progetto/,/^[[:space:]]*$/{/^$utente.*$/d;}" esempio.txt;else echo $progetto ha solo un utente; fi
[progetto 1:/]
utente 1 = rw
utente 2 = rw
utente 3 = rw

[progetto 2:/]
utente 2 = rw

[progetto 3:/]
utente 1 = rw
utente 3 = rw

[progetto 4:/]
utente 1 = rw
utente 2 = rw
utente 3 = rw


mentre:
Codice: Seleziona tutto
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/controllaUtenteProgetto$ progetto="progetto 2"
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/controllaUtenteProgetto$ utente="utente 2"
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/controllaUtenteProgetto$ if [ `sed -ne "/\[$progetto/,/^[[:space:]]*$/p" esempio.txt | wc -l` -gt 3 ]; then sed "/\[$progetto/,/^[[:space:]]*$/{/^$utente.*$/d;}" esempio.txt;else echo $progetto ha solo un utente; fi
progetto 2 ha solo un utente
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/controllaUtenteProgetto$


La seconda volta, il primo if "blocca" tutto. E avverte che c'è solo un utente.
Qualora tu voglia modificare il file di input, ti basta usare l'opzione -i nel secondo sed.
Se ti trova più di un utente ti modifica il file.
Se non ti trova più di un utente, ti avverte.

Ciao
Ultima modifica di l3on4rdo il mercoledì 8 febbraio 2012, 4:39, modificato 1 volta in totale.
Come da regolamento, UNA DISCUSSIONE, PER OGNI PROBLEMA, DOPO aver verificato, con UNA RICERCA, che non sia stato già trattato.
E, prima di sparire con la soluzione, ricorda di mettere [Risolto] nel titolo del primo messaggio della discussione.
La vendetta è un piatto da consumare freddo. Per questo hanno inventato il freezer.
Avatar utente
l3on4rdo
Moderatore Globale
Moderatore Globale
 
Messaggi: 9705
Iscrizione: maggio 2008
Località: Roma
Distribuzione: Ubuntu 10.04.4 e 12.04 64bit
Desktop: Gnome

Re: [Bash] Inserire e cancellare utenti da file di configurazione

Messaggioda l3on4rdo » mercoledì 8 febbraio 2012, 15:16

Ho finito.
Alla fine conviene fare tutto con sed.
Sto cercando di "minimizzare" il numero di letture del file, sto mettendo qualche controllo.
A breve arriva lo script beta (o alfa... io la differenza non l'ho mai capita)

ciao
Come da regolamento, UNA DISCUSSIONE, PER OGNI PROBLEMA, DOPO aver verificato, con UNA RICERCA, che non sia stato già trattato.
E, prima di sparire con la soluzione, ricorda di mettere [Risolto] nel titolo del primo messaggio della discussione.
La vendetta è un piatto da consumare freddo. Per questo hanno inventato il freezer.
Avatar utente
l3on4rdo
Moderatore Globale
Moderatore Globale
 
Messaggi: 9705
Iscrizione: maggio 2008
Località: Roma
Distribuzione: Ubuntu 10.04.4 e 12.04 64bit
Desktop: Gnome

Re: [Bash] Inserire e cancellare utenti da file di configurazione

Messaggioda patel » mercoledì 8 febbraio 2012, 16:05

si trovano in rete esempi di sed ampiamente commentati nei dettagli ?
Un titolo ben azzeccato attira l'attenzione degli esperti in quel campo, fa risparmiare tempo a voi, aumenta la probabilità di successo.
patel
Accecante Asceta
Accecante Asceta
 
Messaggi: 23729
Iscrizione: aprile 2008
Località: Livorno

Re: [Bash] Inserire e cancellare utenti da file di configurazione

Messaggioda l3on4rdo » mercoledì 8 febbraio 2012, 16:17

patel ha scritto:si trovano in rete esempi di sed ampiamente commentati nei dettagli ?

Dipende da che intendi, per esempi.
Nel senso di che livello di "profondità"
Comunque in generale sì.
Sto per postare il codice finale (  :) ) e poi ti posto le documentazioni che di norma controllo io ;)

ciao
Come da regolamento, UNA DISCUSSIONE, PER OGNI PROBLEMA, DOPO aver verificato, con UNA RICERCA, che non sia stato già trattato.
E, prima di sparire con la soluzione, ricorda di mettere [Risolto] nel titolo del primo messaggio della discussione.
La vendetta è un piatto da consumare freddo. Per questo hanno inventato il freezer.
Avatar utente
l3on4rdo
Moderatore Globale
Moderatore Globale
 
Messaggi: 9705
Iscrizione: maggio 2008
Località: Roma
Distribuzione: Ubuntu 10.04.4 e 12.04 64bit
Desktop: Gnome

Re: [Bash] Inserire e cancellare utenti da file di configurazione

Messaggioda l3on4rdo » mercoledì 8 febbraio 2012, 18:24

Forse che forse ce l'abbiamo fatta.
Facendo sempre riferimento ad un file del genere:
Codice: Seleziona tutto
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/controllaUtenteProgetto$ cat esempio.txt
[progetto 1:/]
utente 1 = rw
utente 2 = rw
utente 3 = rw

[progetto 2:/]
utente 2 = rw

[progetto 3:/]
utente 1 = rw
utente 2 = rw
utente 3 = rw

[progetto 4:/]
utente 1 = rw
utente 2 = rw
utente 3 = rw



Hai la gestione delle seguenti "problematicità":

1) il progetto che vuoi elaborare non è presente nel file:
Codice: Seleziona tutto
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/controllaUtenteProgetto$ ./inserisciRimuoviUtente.sh "progetto pippiCalzeLunghe" insert "utente 3" esempio.txt
Il progetto progetto pippiCalzeLunghe non è presente

nota:
ovviamente anche se cerchi di rimuovere un utente da un progetto che non esiste avrai lo stesso warning
(nell'output si ripete la parola progetto (e anche utente nei prossimi output) perché ho chiamato i progetti "progetto qualcosa" e gli utenti "utente qualcosa")

2) il progetto esiste, ma l'utente da rimuovere no
Codice: Seleziona tutto
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/controllaUtenteProgetto$ ./inserisciRimuoviUtente.sh "progetto 3" remove "utente pippiCalzelunghe" esempio.txt
Rimuovo utente pippiCalzelunghe da progetto 3
L'utente utente pippiCalzelunghe non è nel progetto progetto 3


3) il progetto esiste, ma ha un solo utente (e avevi chiesto che questo non venisse rimosso, ma ci fosse un output di avvertimento). Quindi non viene rimosso.
Codice: Seleziona tutto
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/controllaUtenteProgetto$ ./inserisciRimuoviUtente.sh "progetto 2" remove "utente pippiCalzelunghe" esempio.txt
Rimuovo utente pippiCalzelunghe da progetto 2
Il progetto progetto 2 ha solo un utente

nota:
"progetto 2" ha solo "utente 2" e io qui sto chiedendo di rimuovere utente pippiCalzeLunghe.
Non ci si preoccupa se l'utente sia già presente o meno, semplicemente non si fa nulla e si averte... ma si può comunque modificare per far stampare anche la presenza (nel progetto che ha un solo utente) o meno di tale utente che si vuole rimuovere.

4) il progetto esiste ma stai cercando di inserire un utente già presente:
Codice: Seleziona tutto
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/controllaUtenteProgetto$ ./inserisciRimuoviUtente.sh "progetto 2" insert "utente 2" esempio.txt
Inserisco l'utente utente 2 nel progetto 2
L'utente utente 2 è già nel progetto progetto 2


5) chiedi un'azione che non sia né insert né remove
Codice: Seleziona tutto
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/controllaUtenteProgetto$ ./inserisciRimuoviUtente.sh "progetto 3" pippiCalzelunghe "utente 1" esempio.txt
L'operazione pippiCalzelunghe non è supprotata


Altre combinazioni problematiche non mi vengono in mente... ma di sicuro lo script le gestisce ;D

Per le questioni "normali", invece lo script funziona così:

6) inserimento in un progetto esistente di un utente che non sia già presente:
Codice: Seleziona tutto
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/controllaUtenteProgetto$ ./inserisciRimuoviUtente.sh "progetto 2" insert "utente pippiCalzeLunghe" esempio.txt
Inserisco l'utente utente pippiCalzeLunghe nel progetto progetto 2

La modifica è nel file passato in input, e non la stampa a video.
Hai detto che gli utenti non seguono un particolare ordine, quindi ho pensato di inserirlo nella riga successiva a quella del progetto.
Quindi:
Codice: Seleziona tutto
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/controllaUtenteProgetto$ cat esempio.txt
[progetto 1:/]
utente 1 = rw
utente 2 = rw
utente 3 = rw

[progetto 2:/]
utente pippiCalzeLunghe = rw
utente 2 = rw

[progetto 3:/]
utente 1 = rw
utente 2 = rw
utente 3 = rw

[progetto 4:/]
utente 1 = rw
utente 2 = rw
utente 3 = rw



7) eliminazione da un progetto esistente e che non abbia un singolo utente, di un utente che sia presente:
Codice: Seleziona tutto
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/controllaUtenteProgetto$ ./inserisciRimuoviUtente.sh "progetto 3" remove "utente 1" esempio.txt
Rimuovo l'utente utente 1 dal progetto progetto 3

Anche ora la modifica è direttamente nel file di input, quindi:
Codice: Seleziona tutto
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/controllaUtenteProgetto$ cat esempio.txt
[progetto 1:/]
utente 1 = rw
utente 2 = rw
utente 3 = rw

[progetto 2:/]
utente pippiCalzeLunghe = rw
utente 2 = rw

[progetto 3:/]
utente 2 = rw
utente 3 = rw

[progetto 4:/]
utente 1 = rw
utente 2 = rw
utente 3 = rw



Per lo script, fanno ducento euri!!! ;D


Scherzi a parte, lo script che ho pensato è questo:
Codice: Seleziona tutto
#! /bin/bash

project=$1
action=$2
user=$3
fileName=$4


projectRow=`grep -no "$project" "$fileName" | cut -d ':' -f 1`

if [ -z $projectRow ]; then
   echo Il progetto "$project" non è presente
   exit 2
else
   case $action in
   remove)
      echo Rimuovo l\'utente "$user" dal progetto "$project"
      if [ `sed -ne "$projectRow,/^[[:space:]]*$/p" "$fileName" | wc -l` -gt 3 ]; then
         if ! sed -ne "$projectRow,/^[[:space:]]*$/p" "$fileName" | grep "$user" > /dev/null; then
            echo L\'utente "$user" non è nel progetto "$project"
            exit 2
         else
            sed -i "$projectRow,/^[[:space:]]*$/{/^$user.*$/d;}" "$fileName"
         fi
      else
         echo Il progetto "$project" ha solo un utente
         exit 2
      fi
   ;;
   insert)
      echo Inserisco l\'utente "$user" nel progetto "$project"
      if sed -ne "$projectRow,/^[[:space:]]*$/p" "$fileName" | grep "$user" > /dev/null; then
         echo L\'utente "$user" è già nel progetto "$project"
         exit 2
      else
         let "projectRow++"
         string="$user = rw"
         sed -i "$projectRow i $string" "$fileName"
      fi
   ;;
   *)
      echo L\'operazione "$action" non è supprotata
      exit 2
   ;;
   esac
fi


È tutto gestito con sed.
La variabile projectRow serve per evitare che sed debba scorrere più di una volta il file fino a trovare il match con la riga che contiene il nome del progetto.
Ti calcoli il numero della riga all'inizio dello script e poi usi quello invece della prima espressione regolare, come fatto nei post precedenti.
Non so se si possa ulteriormente minimizzare l'uso di sed... ma credo che comunque le cose cambierebbero di poco.
Nei casi problematici, lo script esce con un valore di errore pari a 2... di modo che se devi integrarlo in altro codice puoi basarti su questo.
Se non è un caso problematico, lo script esce con i valori di uscita dei comandi usati.
Non c'è controllo sull'esistenza o meno del file da elaborare, né un controllo sui permessi di lettura e scrittura su tale file, ma o lo si implementa o ci si basa su quanto già fanno i comandi usati all'interno dello script.

La gestione dei parametri in ingresso, inoltre, fa abbastanza schifo.
Intendo qui:
Codice: Seleziona tutto
project=$1
action=$2
user=$3
fileName=$4

Si può risolvere la cosa, per passare i parametri in un modo un po' più gnu-esco... ma non so cosa ti serve quindi mi sono regolato così.
Altre cose da dire non mi vengono in mente... se qualcosa non è chiaro o se funziona ad mentula canis, chiedi o esponi pure eventuali malfunzionamenti.
Altrimenti fammi sapere se te gusta :)

In caso vada bene... avrei da chiederti una cortesia.
Potresti cortesemente dirmi:
1) la dimensione (in righe e byte) dei file che elabori
2) il numero di progetti presenti (approssimativamente) in un file da elaborare
3) il numero di utenti (approssimativamente) in un progetto
4) il tempo di elaborazione che ti viene dato lanciando il comando
Codice: Seleziona tutto
time ./nomeScript.sh et compagnia bella

sui file più "voluminosi" che hai
Intendo una cosa del tipo:
Codice: Seleziona tutto
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/controllaUtenteProgetto$ time ./inserisciRimuoviUtente.sh "progetto 2" insert "utente misoginiaPortamiVia" esempio.txt
Inserisco l'utente utente misoginiaPortamiVia nel progetto 2

real   0m0.020s
user   0m0.070s
sys   0m0.000s

... vorrei capire le performance del tutto.

Ciao.

ps:
@ patel
si trovano in rete esempi di sed ampiamente commentati nei dettagli ?

Io di norma vado a visitare queste pagine:
http://www.gnu.org/software/sed/manual/sed.html
http://sed.sourceforge.net/
Di questo secondo, le FAQ sono una manna e la prima pagina la trovi qui:
http://sed.sourceforge.net/sedfaq1.html
(sotto ci sono i link per le altre)

Sono interessanti anche queste pagine:
http://www.gentoo.org/doc/it/articles/l-sed1.xml
http://www.gentoo.org/doc/it/articles/l-sed2.xml
http://www.gentoo.org/doc/it/articles/l-sed3.xml

Altre cose... le trovo sull'ispirazione del momento :)
Secondo me l'importante è far bene la ricerca con Google, usando appropriatamente le parole chiave.
Ultima modifica di l3on4rdo il mercoledì 8 febbraio 2012, 19:02, modificato 1 volta in totale.
Come da regolamento, UNA DISCUSSIONE, PER OGNI PROBLEMA, DOPO aver verificato, con UNA RICERCA, che non sia stato già trattato.
E, prima di sparire con la soluzione, ricorda di mettere [Risolto] nel titolo del primo messaggio della discussione.
La vendetta è un piatto da consumare freddo. Per questo hanno inventato il freezer.
Avatar utente
l3on4rdo
Moderatore Globale
Moderatore Globale
 
Messaggi: 9705
Iscrizione: maggio 2008
Località: Roma
Distribuzione: Ubuntu 10.04.4 e 12.04 64bit
Desktop: Gnome

Re: [Bash] Inserire e cancellare utenti da file di configurazione

Messaggioda patel » mercoledì 8 febbraio 2012, 20:36

mi spieghi per favore la sintassi di queste 2 linee ?
Codice: Seleziona tutto
if [ `sed -ne "$projectRow,/^[[:space:]]*$/p" "$fileName" | wc -l` -gt 3 ]; then
         if ! sed -ne "$projectRow,/^[[:space:]]*$/p" "$fileName" | grep "$user" > /dev/null; then

in particolare:

^[[:space:]]*$/p
| wc -l
| grep "$user"
> /dev/null

la mia interpretazione è
^[[:space:]]*$/p # riga vuota compresa
| wc -l # conta le righe
| grep "$user" # solo per l'utente scelto
> /dev/null # no output
Ultima modifica di patel il giovedì 9 febbraio 2012, 11:10, modificato 1 volta in totale.
Un titolo ben azzeccato attira l'attenzione degli esperti in quel campo, fa risparmiare tempo a voi, aumenta la probabilità di successo.
patel
Accecante Asceta
Accecante Asceta
 
Messaggi: 23729
Iscrizione: aprile 2008
Località: Livorno

Re: [Bash] Inserire e cancellare utenti da file di configurazione

Messaggioda mikecesure » mercoledì 8 febbraio 2012, 21:40

È il minimo che posso fare per ringraziarti  ;D
1) la dimensione (in righe e byte) dei file che elabori
    - circa 50 righe (per ora poi in futuro aumenteranno sicuramente)
    - `wc -c file` restituisce 428
2) il numero di progetti presenti (approssimativamente) in un file da elaborare
    variabile, per ora ce ne sono 13
3) il numero di utenti (approssimativamente) in un progetto
    la media sarà di 1,4 molto approssimativamente
4) il tempo di elaborazione che ti viene dato lanciando il comando
    real    0m0.009s
    user    0m0.012s
    sys    0m0.008s

Lo script funziona davvero bene, ti ringrazio  (good), mi sa che mi metterò a studiare sed, appena ho un po' di tempo  ;D
Ora lo integro nello script originale, per le variabili di input, nessun problema, le prendo grazie ad un `read` ;)

Grazie per il tempo che mi hai dedicato  :'( quasi mi commuovo  (b2b)
mikecesure
Prode Principiante
 
Messaggi: 186
Iscrizione: ottobre 2009

Re: [Bash] Inserire e cancellare utenti da file di configurazione

Messaggioda mikecesure » mercoledì 8 febbraio 2012, 23:59

Dato che ci siamo, chiedo un'altra consulenza per finire lo script  :D

Per cancellare un progetto intero dal file uso questi comandi, dovrebbe funzionare:
Codice: Seleziona tutto
projectRow=`grep -no "$project" "$fileName" | cut -d ':' -f 1`
sed -i "$projectRow,/^[[:space:]]*$/{/^.*$/d;}" "$fileName"


Ma prima di eseguirli, mi serve sapere quali utenti ci sono nel progetto, perché devo agire sulle loro cartelle personali...
Quindi, la mia idea era:
Codice: Seleziona tutto
users=$(sed -ne "$projectRow,/^[[:space:]]*$/p" "$fileName")
for user in $users; do
   codice di verifica
done;


$users diventa un array, in pratica spezza il file ad ogni spazio e ad ogni a capo, quindi il "codice di verifica" dovrebbe controllare se l'elemento $user non sia uguale ad "=" o "rw" oppure il primo carattere non sia "[", per i primi due tutto apposto, ma per quest'ultima evenienza??
Avete un consiglio ??  >:(
Tks
mikecesure
Prode Principiante
 
Messaggi: 186
Iscrizione: ottobre 2009

Re: [Bash] Inserire e cancellare utenti da file di configurazione

Messaggioda l3on4rdo » giovedì 9 febbraio 2012, 16:58

mi spieghi per favore la sintassi di queste 2 linee ?

Certo :)
(quanto segue ovviamente... è quello che ho capito io ;D )

Allora:
Codice: Seleziona tutto
sed -ne "$projectRow,/^[[:space:]]*$/p"

L'opzione -n è collegata all'ultima p del comando.
Codice: Seleziona tutto
       -n, --quiet, --silent

              suppress automatic printing of pattern space

Se la levi, ti stampa tutto il file (in termini "tecnici" ti stampa il pattern space ad ogni iterazione), ma con due righe quando trova le corrispondenze.
Se la metti, gli dici di non stampare il pattern space, a meno che non trova la corrispondenza con l'espressione regolare.

Codice: Seleziona tutto
"$projectRow,/^[[:space:]]*$/p"

In questo "comando" di sed... si usa un po' di roba.
Come prima cosa si restringe la ricerca con l'uso degli indirizzi. In particolare questo:
0,/regexp/
A line number of 0 can be used in an address specification like 0,/regexp/ so that sed will try to match regexp in the first input line too. In other words, 0,/regexp/ is similar to 1,/regexp/, except that if addr2 matches the very first line of input the 0,/regexp/ form will consider it to end the range, whereas the 1,/regexp/ form will match the beginning of its range and hence make the range span up to the second occurrence of the regular expression.
Note that this is the only place where the 0 address makes sense; there is no 0-th line and commands which are given the 0 address in any other way will give an error.

La riga dove si trova il progetto la devi calcolare, perché ti serve per vedere se il progetto è presente o meno.
Già che l'hai calcolata... gliela passi in un secondo momento per evitare di rileggere tutto il file da capo.
Gliela passi direttamente per dirgli: "sed, stai sereno... puoi iniziare da questa riga".
Il secondo "indirizzo" glielo passi sotto forma di espressione regolare, per indicargli quando si deve fermare.

Il senso di quell'espressione regolare è:
^ -> da inizio riga

[[:space:]]* -> indica che vuoi zero o più spazi, in quanto l'asterisco è un quantificatore, che fa in modo che l'elemento che lo precede (in questo caso uno spazio) sia ripetuto zero o più volte

$ -> fine riga

E quindi gli stai dicendo di prendere le righe "vuote" dove per vuote si intende che possono contenere, eventualmente, solo spazi.
In questo modo, se per caso hai un file con un utente che non inizia a inizio riga, ma ha uno spazio davanti al nome... perché magari c'è finito per sbaglio, te la conta... ma quando trova una riga o veramente vuota (ovvero con inizio riga e subito un "a capo) o con soli spazi, interrompe la ricerca.

Codice: Seleziona tutto
wc -l

ti conta le righe dell'output del comando precedente (per via della pipe | ) e serve perché c'era il problema di progetti con un solo utente. Un progetto con un solo utente ha tre righe (il nome del progetto, l'utente e la riga vuota di separazione)

La riga
Codice: Seleziona tutto
if ! sed -ne "$projectRow,/^[[:space:]]*$/p" "$fileName" | grep "$user" > /dev/null; then

è analoga alla precedente nella prima parte e per quanto riguarda il comando sed.
La sintassi:
Codice: Seleziona tutto
if ! comando

indica a bash di regolarsi con il valore ritornato dal comando.
Se il comando "esce" 0, vuol dire che è "andato a buon fine".
In questo caso il comando è tutto quello che segue, fino al punto e virgola.
Gli stai chiedendo di controllare se nell'output del progetto è presente l'utente user, perché dai tale output di sed in pasto al comando grep, tramite la pipe... e quando usi la pipe, il valore di uscita è quello dell'ultimo comando.
Infine, siccome dell'output te ne frega nada... lo redirezioni in /dev/null.
In pratica, se grep trova l'utente esce 0 (vero), se non lo trova invece esce 1 (falso).
Con il ! davanti, fai la "negazione logica" di tale valore ritornato dalla pipe... e quindi, se non trova l'utente (ovvero se non "greppi" l'utente nell'output del comando sed), ti dice che non è nel progetto, altrimenti te lo rimuove (il controllo sul fatto che non sia l'ultimo utente è fatto con la prima delle due righe di codice che t'ho illustrato sopra)

Spero di essere stato abbastanza chiaro, altrimenti chiedi :)
Ultima modifica di l3on4rdo il giovedì 9 febbraio 2012, 17:19, modificato 1 volta in totale.
Come da regolamento, UNA DISCUSSIONE, PER OGNI PROBLEMA, DOPO aver verificato, con UNA RICERCA, che non sia stato già trattato.
E, prima di sparire con la soluzione, ricorda di mettere [Risolto] nel titolo del primo messaggio della discussione.
La vendetta è un piatto da consumare freddo. Per questo hanno inventato il freezer.
Avatar utente
l3on4rdo
Moderatore Globale
Moderatore Globale
 
Messaggi: 9705
Iscrizione: maggio 2008
Località: Roma
Distribuzione: Ubuntu 10.04.4 e 12.04 64bit
Desktop: Gnome

PrecedenteSuccessiva

Torna a Programmazione

Chi c’è in linea

Visualizzano questa pagina: Eresia, SuperStep e 1 ospite