Newsgroup: it.comp.os.linux.iniziare
Titolo: Re: grep

 grep username voip.cfg
grep -e passwd -e username voip.cfg
oppure dovrebbe funzionarti anche
grep 'passwd\|username' voip.cfg

 grep 'passwd\|username' voip.cfg
... oppure anche
egrep 'passwd|username'
;-)
Ci sarebbe anche un altro sistema, che avevo scoperto tempo fa, per caso,
partendo dal fatto che grep può usare delle stringhe di ricerca in OR
prelevandole da un file: lo switch -F
(((
da man grep:
       -F, --fixed-strings
              Interpret PATTERN as a list of fixed strings, separated by
              newlines, any of which is to be matched.
)))
Bene, quindi
grep -F "passwd<qui 'carriage-return'>
username"
fa anche lui al caso tuo.
PERO'... ***come fare se si vogliono usare le regexp?***
Lo switch -F, infatti, lavora solo con fixed-strings.
Beh... è questo che avevo scoperto: si fa come segue (oltre ai
modi --probabilmente più canonici-- indicati da antani).
Supponiamo di avere il seguente file:
-------------------
username kjhkjhkjh passwd lkjlkjlkj
usornames lkjlkjlkj paswords lkjlkjlkj
-------------------
... cioè un file che possa contenere degli errori di digitazione (caso
tipicamente frequente quando viene prodotto da esseri umani).
grep -F "passwd<qui 'carriage-return'>
username"
mi estrae solo la prima riga... e...
grep -F 'pa.+wd<qui 'carriage-return'>
us.rname'
... non trova niente (per ovvi motivi)
MA...
grep 'pa.+wd<qui 'carriage-return'>
us.rname'
... è proprio quello che serve !
Restituisce:
-----------------------
username kjhkjhkjh passwd lkjlkjlkj
usornames lkjlkjlkj paswords lkjlkjlkj
-----------------------
... proprio come se facessi:
grep -e 'pa.+wd' -e 'us.rname'
oppure
grep 'pa.+wd\|us.rname'
oppure
egrep 'pa.+wd|us.rname'

 ... è proprio quello che serve !
Si', grep tratta una sequenza di espressioni regolari separate da newline
come pattern da mettere in or, come avviene con -F. Io preferisco comunque
sempre usare questa sintassi:
grep -e regexp1 -e regexp2 ... file
(se vuoi usare le espressioni estese, usa egrep oppure grep -E)
PS: grep 'pa.+wd' non fa quello che pensi tu. Guarda bene la distinzione tra
BRE e ERE.

Ieri mi sono reso conto, troppo tardi, che il mio file di esempio per il
quesito di pinotto era insensato, perché mettendo le due condizioni che
devono essere ALTERNATIVE sulla medesima riga, cioè così:
-------------------
username kjhkjhkjh passwd lkjlkjlkj
usornames lkjlkjlkj paswords lkjlkjlkj
-------------------
... grep avrebbe matchato sempre positivamente tutte le righe semplicemente
perché gli bastava che fosse verificata una sola condizione.
Un file di esempio sensato per il problema in questione, in cui deveno cioè
essere trovate tutte le righe che contengano l'una condizione ("username"),
OPPURE l'altra ("passwd"), dovrebbe essere come segue.
----------------------
username AAAAAAAAAAA
passwd 11111111
usorname BBBBBBBBB
pasword 222222222222
usernames CCCCCCCCCCCCC
passwds 3333333333
----------------------
Ed ecco, rifatta, la sequenza dei comandi possibili usando "-F" (cioè
ricerca di fixed strings alternative), usando le regexp col metodo
dell'andata_a_capo e usando le regexp con le extended regexp (utilizzo
di " | ").
grep -F "username<qui_a_capo>
passwd" prova4.txt
      username AAAAAAAAAAA
      passwd 11111111
      usernames CCCCCCCCCCCCC
      passwds 3333333333
grep '^u.*<qui_a_capo>
^p.*' prova4.txt
      username AAAAAAAAAAA
      passwd 11111111
      usorname BBBBBBBBB
      pasword 222222222222
      usernames CCCCCCCCCCCCC
      passwds 3333333333
grep '^u.*\|^p.*'
          ^
        notare
      username AAAAAAAAAAA
      passwd 11111111
      usorname BBBBBBBBB
      pasword 222222222222
      usernames CCCCCCCCCCCCC
      passwds 3333333333
egrep '^u.*|^p.*'
      username AAAAAAAAAAA
      passwd 11111111
      usorname BBBBBBBBB
      pasword 222222222222
      usernames CCCCCCCCCCCCC
      passwds 3333333333
grep -e 'u.*' -e '^p.*'
      username AAAAAAAAAAA
      passwd 11111111
      usorname BBBBBBBBB
      pasword 222222222222
      usernames CCCCCCCCCCCCC
      passwds 3333333333

 tra BRE e ERE.
Hai ragione, ed ero stato tratto in inganno dallo stupido file di esempio
sul quale avevo provato il comando, perché il match avveniva comunque (vedi
precedente mio messaggio odierno).
Ci ho messo un po' :-) a capire il significato di BRE e ERE (pensavo ti
riferissi a delle stringhe di testo :-/ .
Morale:
posso usare
egrep 'pa.+d'
oppure usare grep (che nella mia versione implementa le funzioni prima
esclusive di egrep), ma usare un escape prima del "+" (perché ovviamente
grep implementa anche le funzioni delle ERE, ma bisogna stare attenti alla
sintassi, come bisogna stare attenti usando "sed", invece di "sed -r")
grep 'pa.\+d'
Come sempre: grazie.

 grep 'pa.\+d'
Non c'e' bisogno di usare \+ con grep (anche se il grep GNU lo supporta),
perche' si puo' esprimere la stessa cosa con \{1,\} (che, a differenza di
+, fa parte delle BRE).