2011-01-25 13 views
38

Ho un file in cui voglio grep per le righe che iniziano con -rwx o drwx E terminano con qualsiasi numero.Grep per inizio e fine riga?

Ho questo, ma non è giusto. Qualche idea?

grep [^.rwx]*[0-9] usrLog.txt 

risposta

39

La parte difficile è un'espressione regolare che include un trattino come uno dei caratteri validi in una classe di caratteri. Il trattino deve venire immediatamente dopo l'inizio per una classe di caratteri (normale) e immediatamente dopo il punto di inserimento per una classe di caratteri negata. Se hai bisogno anche di una parentesi quadra chiusa, hai bisogno della parentesi quadra chiusa seguita dal trattino. Per fortuna, hai solo bisogno di un trattino, quindi la notazione scelta.

grep '^[-d]rwx.*[0-9]$' "[email protected]" 

See: Regular Expressions e grep per i dettagli POSIX-standard.

+2

Oppure 'grep -x '[-d] rwx. * [0-9]''. – ephemient

+0

Su Linux, sì - o dove viene utilizzato GNU grep. La versione che ho citato funzionerà su tutte le varianti di Unix, che vorrei presentare lo rende migliore. –

+2

'-x' è POSIX. Seguendo il trattino: '[[.-.] [.].]]' (Che, scontato, è meno leggibile di '[] -]'). Io * credo * questo è anche POSIX ... – ephemient

3

Probabilmente vuoi egrep. Prova:

egrep '^[d-]rwx.*[0-9]$' usrLog.txt 
15

Sembra che tu eri sulla strada giusta ... Il personaggio ^ partite inizio-of-line, e $ partite di fine linea. Lo schema di Jonathan funzionerà per te ... volevo solo darti la spiegazione dietro di esso

+3

Non del tutto sulla buona strada, però. È significativo notare che i caratteri all'interno di una classe di caratteri '[]' si comportano in modo significativamente diverso rispetto a quello che avrebbero in altre parti della regex. – ephemient

1

stai analizzando l'output di ls -l?

Se lo siete, e si desidera solo per ottenere il nome del file

find . -iname "*[0-9]" 

Se non hai scelta perché usrLog.txt è stato creato da qualcosa/qualcun altro e si deve assolutamente utilizzare questo file, le altre opzioni includere

awk '/^[-d].*[0-9]$/' file 

rubino (1.9+)

ruby -ne 'print if /^[-d].*[0-9]$/' file 

Bash

while read -r line ; do case $line in [-d]*[0-9]) echo $line; esac; done < file 
4

Si noti che non solo il cursore (^) si comporta in modo diverso all'interno delle parentesi, ma avrà il risultato opposto di posizionarlo al di fuori delle parentesi. Posizionando il punto in cui si trova, cercherà tutte le stringhe che NON iniziano con il contenuto inserito tra parentesi. Dovresti anche mettere un punto prima dell'asterisco tra parentesi come con grep, ma agisce anche da "jolly".

grep ^[.rwx].*[0-9]$ 

Questo dovrebbe funzionare per voi, ho notato che alcuni manifesti usati una classe di caratteri nelle loro espressioni, che è un metodo efficace pure, ma non utilizzavano alcun nella tua espressione originale in modo sto cercando di ottenere uno il più vicino possibile al tuo, spiegando ogni piccolo cambiamento lungo la strada in modo che sia meglio compreso. Come possiamo imparare diversamente?

Problemi correlati