[Risolto] shell controllare una riga di file di testo

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

[Risolto] shell controllare una riga di file di testo

Messaggioda JordanDunk » mercoledì 17 maggio 2017, 11:34

Buongiorno a tutti. Sto cercando di fare questo Scipt: inserire il nome di un gruppo, ne verifica l’esi-
stenza e come output mi da gli utenti appartenenti a quel gruppo. Nel caso in cui il gruppo non esista o non vi siano utenti in quel gruppo, segnala l’errore.

I mie due file sono:
passwd.txt:
Aragon:ilritornodelre:12:1000:il legittimo re:/home/aragon:/bin/bash
Gimmly:777888999:66:800:moria mia:/home/gimmly:/bin/bash
Legolas:odioinani:99:42:biondo arco:/home/legolas:/bin/bash
Frodo:pass111:23:1000:il portatore:/home/frodo:/bin/bash
Gollum:19191919:200:67:il mio tessssoro:/home/Gollum:/bin/bash
Sauron:unanelloperdomarli:10:20:the boss of the montefato:/home/Sauron/:/bin/bash
Aragon 2:aragonpass:13:32:the secret account of Aragon:/home/private/aragonhide/:/bin/hidebash

group.txt:
Moria Miniere:800
Admin:32
Aragon Team:320
Elfo lungo:42
Stregone:73
l'occhio:20
Compagnia:1000
mangio pesce:67
Urukai:13

es se inserisco Compagnia lo script verifica che esista e una volta verificato mi dovrebbe stampare Frodo e Aragon. Io l'ho fatto cosi:

nome_file='group.txt'

function Utenti_del_gruppo(){
awk -F: 'FNR==NR {a[$2]=$nome_gruppo; next} { if ($4 in a) {print $1 "---------->" a[$4]}}' group.txt passwd.txt
}

function inserimento(){
echo "Inserire nome del gruppo"
read nome_gruppo

if ! grep -q "$nome_gruppo" "$nome_file"; then # -q serve per non vedere l'output del grep
echo -e "Nome gruppo non valido! Reinserirlo\n"
inserimento
fi
}

inserimento
Utenti_del_gruppo

Cosi però mi stampa tutti gli utenti del gruppo e no solo quello che ho chiesto io :( inoltre se chiamo gruppo senza utenti non mi da errore. Voi sapreste darmi una mano ???
Ultima modifica di JordanDunk il giovedì 18 maggio 2017, 9:55, modificato 1 volta in totale.
JordanDunk
Prode Principiante
 
Messaggi: 45
Iscrizione: aprile 2017
Desktop: Ubuntu
Distribuzione: Ubunto 16.10 | x86_64
Sesso: Maschile

Re: shell controllare una riga di file di testo

Messaggioda JordanDunk » mercoledì 17 maggio 2017, 11:59

Oppure nel comando awk -F: 'FNR==NR {a[$2]=$nome_gruppo; next} { if ($4 in a) {print $1 "---------->" a[$4]}}' group.txt passwd.txt
potrei aggiungere un grep in modo che mi vada a lavorare solo sul valore che gli ho passato ?
JordanDunk
Prode Principiante
 
Messaggi: 45
Iscrizione: aprile 2017
Desktop: Ubuntu
Distribuzione: Ubunto 16.10 | x86_64
Sesso: Maschile

Re: shell controllare una riga di file di testo

Messaggioda UbuNuovo » mercoledì 17 maggio 2017, 15:41

Per il forum:
Prendi l'abitudine di mettere: codice e contenuto di file, trai tag code.
Non fare post ravvicinati, modifica quello precedente, aggiungi "Edit" per far vedere che il post è stato modificato.


Se ti serve anche l'elenco usa la funzione (corretta però) e poi greppala; se invece non ti serve l'elenco, devi correggere la funzione e cambiare la condizione, (il gruppo è già verificato con grep).

In ogni caso
Codice: Seleziona tutto
...{a[$2]=$nome_gruppo; next...
è un doppio sbaglo!
1 - La variabile non viene espansa!
2 - In quel modo assegneresti sempre lo stesso valore della variabile all'array.
Quella parte di codice serve per riempire l'array, con chiavi e valori scelti da noi, è basilare capire questo.

Per fare come dici, se ho capito bene, dovresti fare una cosa del genere:
Codice: Seleziona tutto
awk -F ":" -v var="$nome_gruppo" 'FNR==NR {a[$2]=$1; next} { if (a[$4] == var) {print $1 "---------->" a[$4]}}' group.txt passwd.txt


Ti dovresti studiare le basi di awk altrimenti non cavi un ragno dal buco.
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 2801
Iscrizione: dicembre 2009
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile

Re: shell controllare una riga di file di testo

Messaggioda thece » mercoledì 17 maggio 2017, 17:26

:ciao:

JordanDunk Immagine ha scritto:Buongiorno a tutti. Sto cercando di fare questo Scipt: inserire il nome di un gruppo, ne verifica l’esi-
stenza e come output mi da gli utenti appartenenti a quel gruppo. Nel caso in cui il gruppo non esista o non vi siano utenti in quel gruppo, segnala l’errore.

Per come lo hai spiegato potrebbe andar bene anche questo ... no, comunque non va bene perchè non ho tenuto conto della struttura che tu hai dato al file group.txt. Per brevità mia, io mi sono basato sulla struttura del file /etc/group originale

(modificato, da terminare)

Codice: Seleziona tutto
#!/bin/bash

NUOVO_GRUPPO="$1"
CHECK_GRUPPO=""
GRUPPO=""

FILE_GRUPPI="/temp/group.txt"
FILE_UTENTI="/temp/passwd.txt"

if [[ ! -f "$FILE_GRUPPI" ]]; then

        echo "[ERR] Il file '$FILE_GRUPPI' non esiste"
        exit 1
fi

if [[ ! -f "$FILE_UTENTI" ]]; then

        echo "[ERR] Il file '$FILE_UTENTI' non esiste"
        exit 1
fi

if [[ -z "$NUOVO_GRUPPO" ]]; then

        echo "[ERR] Specificare il nome del Gruppo"
        exit 1
fi

CHECK_GRUPPO=$(cat "$FILE_GRUPPI" | grep "^$NUOVO_GRUPPO:")

if [[ ! -z "$CHECK_GRUPPO" ]]; then

        # ... vecchia versione
        # CHECK_GRUPPO=$(echo "$CHECK_GRUPPO" | awk 'BEGIN {FS=":"} {print $4}')
        # echo "[INFO] Utenti appartenenti al gruppo '$NUOVO_GRUPPO': $CHECK_GRUPPO"

        # ... da terminare
        GRUPPO=$(echo "$CHECK_GRUPPO" | awk 'BEGIN {FS=":"} {print $2}')
        cat "$FILE_UTENTI" | grep ":$GRUPPO:"

else

        echo "$NUOVO_GRUPPO:x:####:" >> "$FILE_GRUPPI"
        echo "[INFO] Il gruppo '$NUOVO_GRUPPO' è stato aggiunto al file '$FILE_GRUPPI'"
fi

exit 0
Ultima modifica di thece il giovedì 18 maggio 2017, 0:52, modificato 4 volte in totale.
Avatar utente
thece
Rampante Reduce
Rampante Reduce
 
Messaggi: 7243
Iscrizione: aprile 2007
Distribuzione: Debian 8 (Jessie) - KDE 4.14

Re: shell controllare una riga di file di testo

Messaggioda UbuNuovo » mercoledì 17 maggio 2017, 18:02

@Thece:
Non è proprio così, lui ha i dati su due file, in uno ha il gruppo in testo e in codice numerico, nell'altro ha nomi e gruppo ma il gruppo è in codice numerico deve estrarre il nome e il gruppo in formato testuale utilizzando entrambi i file. :)

@JordanDunk:
Per grep ti avevo fatto vedere nell'altra discussione come fare, devi mettere una regex più specifica.
Lo script con le righe sbagliate e corrette è questo:
Codice: Seleziona tutto
#!/bin/bash
nome_file='group.txt'
function Utenti_del_gruppo(){
   #awk -F: 'FNR==NR {a[$2]=$nome_gruppo; next} { if ($4 in a) {print $1 "---------->" a[$4]}}' group.txt passwd.txt   ## SBAGLIATA
   awk -F ":" -v var="$nome_gruppo" 'FNR==NR {a[$2]=$1; next} { if (a[$4] == var) {print $1 "---------->" a[$4]}}' group.txt passwd.txt
}

function inserimento(){
   echo "Inserire nome del gruppo"
   read nome_gruppo

   #if ! grep -q "$nome_gruppo" "$nome_file"; then # -q serve per non vedere l'output del grep ## SBAGLIATA
   if ! grep -q "^$nome_gruppo:" "$nome_file"; then
      echo -e "Nome gruppo non valido! Reinserirlo\n"
      inserimento
   fi
}

inserimento
Utenti_del_gruppo
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 2801
Iscrizione: dicembre 2009
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile

Re: shell controllare una riga di file di testo

Messaggioda thece » mercoledì 17 maggio 2017, 21:32

:ciao:

UbuNuovo Immagine ha scritto:@Thece:
Non è proprio così, lui ha i dati su due file ...

Senza voler innescare alcuna polemica, permettimi ma da quanto ha scritto @JordanDunk, riporto nuovamente

JordanDunk ha scritto:... Sto cercando di fare questo Scipt: inserire il nome di un gruppo, ne verifica l’esistenza e come output mi da gli utenti appartenenti a quel gruppo. Nel caso in cui il gruppo non esista o non vi siano utenti in quel gruppo, segnala l’errore.
...
es se inserisco Compagnia lo script verifica che esista e una volta verificato mi dovrebbe stampare Frodo e Aragon. Io l'ho fatto cosi:
...
Cosi però ...

non mi sembra che sia così.
Io mi sto limitando a quello che @JordanDunk ha richiesto nel suo primo post, l'oggetto di questa discussione, quindi senza alcun riferimento ad altre. Se poi scrive una cosa ma ne intende un'altra allora il problema non è lo scripting Bash ma altro

:birra:
Avatar utente
thece
Rampante Reduce
Rampante Reduce
 
Messaggi: 7243
Iscrizione: aprile 2007
Distribuzione: Debian 8 (Jessie) - KDE 4.14

Re: shell controllare una riga di file di testo

Messaggioda UbuNuovo » mercoledì 17 maggio 2017, 21:55

:D Ti capisco. Non è facile spiegare/capire cosa effettivamente sia richiesto.
Per capire (almeno spero) cosa volesse fare ho fatto riferimento a discussioni che avevo già seguito.
Inserisco i link per chi approdasse a questa discussione senza conoscere le altre.
Per grep:
viewtopic.php?f=33&t=621060
Qua si vede bene cosa si doveva fare, è l'origine della nuova riga di codice AWK:
viewtopic.php?f=33&t=621059
Ne esisteva anche un'altra che non ricordo/trovo più.
:birra:
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 2801
Iscrizione: dicembre 2009
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile

Re: shell controllare una riga di file di testo

Messaggioda JordanDunk » giovedì 18 maggio 2017, 9:54

Esatto @UbuNuovo, il codice che hai messo è quello che si avvicina di più, ho fatto qualche modifica e mi viene giusto :)
@thece si hai ragione, non mi ero spiegato benissimo. Comunque userò anche i tuoi consigli, grazie veramente :)
JordanDunk
Prode Principiante
 
Messaggi: 45
Iscrizione: aprile 2017
Desktop: Ubuntu
Distribuzione: Ubunto 16.10 | x86_64
Sesso: Maschile


Torna a Programmazione

Chi c’è in linea

Visualizzano questa sezione: 0 utenti registrati e 7 ospiti