[BASH] Problema con script di ricerca e modifica

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
jxmmy000
Prode Principiante
Messaggi: 6
Iscrizione: giovedì 2 febbraio 2017, 10:41
Desktop: Unity
Distribuzione: Ubuntu 16.10 x86_64
Sesso: Maschile

[BASH] Problema con script di ricerca e modifica

Messaggio da jxmmy000 »

Buongiorno ragazzi :ciao: :ciao:
Scrivo perché ho difficoltà con la realizzazione di uno script bash che credevo banale ma mi sta dando problemi che non riesco a capire. La specifica è la seguente, sotto posto la mia soluzione e l'errore che davvero non capisco segnalatomi dal terminale.
Realizzare uno script bash che riceva due parametri:
* il nome di un utente del sistema
* il nome di un direttorio.
Lo script deve riconoscere tutti i file dell'utente specificato
che si trovano nel direttorio indicato e che contengono (almeno)
una riga che comincia con la stringa
"***Da modificare"
In tali file occorre:
* cancellare tale riga
* appendere al nome del file stesso la stringa "_mod".
Mia soluzione:

Codice: Seleziona tutto

#! /bin/bash

for file in $(find $2 -user$1); do
if grep -lnq "^***Da modificare" $file
then
more $file 
sed -i "/$line/g" $file 
mv "$file" "${file}_mod"
fi 
done
exit 0
All'esecuzione il terminale mi segnala:
grep: /home/jimmy/esame/dir2: È una directory /questa è la directory che gli passo come argomento.. ???
mv: impossibile eseguire stat di '$file': File o directory non esistente
mv: impossibile eseguire stat di '$file': File o directory non esistente
mv: impossibile eseguire stat di '$file': File o directory non esistente
Non capisco dove abbia sbagliato ma ho davvero necessità di chiarirlo :muro: Grazie mille a chi mi aiuterà!
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: [BASH] Problema con script di ricerca e modifica

Messaggio da crap0101 »

find elenca tutto, anche le directory, per cui devi filtrare i soli file.

btw, `$line` non esiste
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: [BASH] Problema con script di ricerca e modifica

Messaggio da UbuNuovo »

Qualche consiglio di base:
Indenta il codice
Usa variabili con un nome descritivo invece di usare direttamente $1,S2...
è preferibile usare cicli while e read sui file trovati da find, considera l'uso di -print0 se sono presenti spazi nei nomi dei file.
Quotare le variabili.

Nel tuo caso.
Prova i vari comandi direttamente da terminale e vedi subito gli errori;
Per esempio:
in sed, per la cancellazione si usa il modificatore 'd' non 'g' che ha tutt'altro significato
come ti ha già detto Crap.
con find è meglio usare anche '-type f' per restringere i risultati ai soli file;
usi la variabile $line senza avergli assegnato nulla.
Devi fare l'escape degli asterischi prima di usarli in grep e sed,
ti conviene usare la variabile impostata così:

Codice: Seleziona tutto

line='^\*\*\*Da modificare'
Salva l'Ucraina! 🇺🇦
jxmmy000
Prode Principiante
Messaggi: 6
Iscrizione: giovedì 2 febbraio 2017, 10:41
Desktop: Unity
Distribuzione: Ubuntu 16.10 x86_64
Sesso: Maschile

Re: [BASH] Problema con script di ricerca e modifica

Messaggio da jxmmy000 »

crap0101 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4955735#p4955735][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:find elenca tutto, anche le directory, per cui devi filtrare i soli file.

btw, `$line` non esiste
Grazie mille per il chiarimento su find, lo avevo totalmente ignorato! Quel "line" mi è sfuggito perché prima avevo provato tramite a scandire nel for solo le righe corrispondenti tramite una pipe tra la find e la grep, provo a risolvere :)
jxmmy000
Prode Principiante
Messaggi: 6
Iscrizione: giovedì 2 febbraio 2017, 10:41
Desktop: Unity
Distribuzione: Ubuntu 16.10 x86_64
Sesso: Maschile

Re: [BASH] Problema con script di ricerca e modifica

Messaggio da jxmmy000 »

UbuNuovo [url=http://forum.ubuntu-it.org/viewtopic.php?p=4955771#p4955771][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Qualche consiglio di base:
Indenta il codice
Usa variabili con un nome descritivo invece di usare direttamente $1,S2...
è preferibile usare cicli while e read sui file trovati da find, considera l'uso di -print0 se sono presenti spazi nei nomi dei file.
Quotare le variabili.

Nel tuo caso.
Prova i vari comandi direttamente da terminale e vedi subito gli errori;
Per esempio:
in sed, per la cancellazione si usa il modificatore 'd' non 'g' che ha tutt'altro significato
come ti ha già detto Crap.
con find è meglio usare anche '-type f' per restringere i risultati ai soli file;
usi la variabile $line senza avergli assegnato nulla.
Devi fare l'escape degli asterischi prima di usarli in grep e sed,
ti conviene usare la variabile impostata così:

Codice: Seleziona tutto

line='^\*\*\*Da modificare'
Grazie mille Ubu :D
A proposito di sed, il mio professore a lezione non ne ha parlato e non so se all'esame potrei ricorrervi. Esiste un modo alternativo per la cancellazione di un'intera stringa? Do una controllata generale a tutto come dicevi intanto.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: [BASH] Problema con script di ricerca e modifica

Messaggio da UbuNuovo »

Per cancellare righe contenenti un dato pattern potresti usare usare

Codice: Seleziona tutto

grep -v 'pattern' file > file_mod
Salva l'Ucraina! 🇺🇦
jxmmy000
Prode Principiante
Messaggi: 6
Iscrizione: giovedì 2 febbraio 2017, 10:41
Desktop: Unity
Distribuzione: Ubuntu 16.10 x86_64
Sesso: Maschile

Re: [BASH] Problema con script di ricerca e modifica

Messaggio da jxmmy000 »

UbuNuovo [url=http://forum.ubuntu-it.org/viewtopic.php?p=4955782#p4955782][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Per cancellare righe contenenti un dato pattern potresti usare usare

Codice: Seleziona tutto

grep -v 'pattern' file > file_mod
Ho sistemato il codice seguendo le indicazioni e il risultato è quasi soddisfacente, vi ringrazio di nuovo. Al momento ho:

Codice: Seleziona tutto

     #!/bin/bash

     directory=$2; utente=$1

            for file in $(find  $directory -type f -user $utente)
            do
                  line=$(grep -e '^\*\*\*Da modificare' $file) 
      	         grep -v $line $file > ${file}_mod
                  rm $file 
            done

      exit 0
L'unico problema è che sull'output mi ritrovo il path assoluto del file in lettura che precede la riga, mentre la cancellazione e la rinominazione funzionano.
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: [BASH] Problema con script di ricerca e modifica

Messaggio da crap0101 »

riguardo l'escape dei `*` notavo una cosa un po' strana, o per lo meno che leggendo la documentazione si capisce diversamente:

Codice: Seleziona tutto

crap0101@orange:~$ echo '***Da' | grep '^***D'
***Da
crap0101@orange:~$ echo '***Da' | grep -o '^***D'
***D
crap0101@orange:~$ echo '***Da' | grep -E '^***D'
***Da
crap0101@orange:~$ echo $?
0
crap0101@orange:~$ echo '***Da' | grep -Eo '^***D'
crap0101@orange:~$ echo '*1*Da' | grep '^***D'
crap0101@orange:~$ echo '*1*Da' | grep -E '^***D'
*1*Da
crap0101@orange:~$ echo '*1*Da' | grep -P '^***D'
grep: nothing to repeat
crap0101@orange:~$ echo '*1*Da' | grep -E '^\*\*\*D'
crap0101@orange:~$ echo '***Da' | grep -E '^\*\*\*D'
***Da
crap0101@orange:~$ grep --version
grep (GNU grep) 2.25
per cui, usando le BRE come ha fatto lui va bene anche non fare l'escape, anche se la risposta più corretta mi sempra quella delle PCRE, che appunto segnalano che non c'è nulla da ripetere (tranne per le BRE, se non ha quel significato). Da notare che con le ere, con lo stesso input con cui trova un match, usando -o non lo stampa...
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 5 ospiti