2011-01-25 12 views
38

Mam plik, w którym chcę grep dla linii, które zaczynają się od -rwx lub drwx I zakończyć w dowolnej liczbie.Grep dla początku i końca linii?

Mam to, ale to nie jest w porządku. Jakieś pomysły?

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

Odpowiedz

39

Najtrudniejszą częścią jest wyrażenie regularne, które zawiera myślnik jako jeden z poprawnych znaków w klasie znaków. Deska musi nadejść natychmiast po starcie dla (normalnej) klasy postaci i zaraz po karetce dla zignorowanej klasy postaci. Jeśli potrzebujesz również kwadratowego wspornika, musisz zamknąć kwadratowy wspornik, a następnie myślnik. Na szczęście wystarczy odrobinę, stąd wybrana notacja.

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

Patrz: Regular Expressions i grep dla POSIX standardowych szczegółów.

+2

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

+0

W systemie Linux, tak - lub w przypadku użycia GNU grep. Wersja, którą zacytowałem, będzie działała na wszystkich wersjach Uniksa, które przesyłam, czyni ją lepszą. –

+2

'-x' jest POSIX. Bracket następujący po kresce: '[[.-.] [.].]]' (Co, przyznane, jest mniej czytelne niż '[] -]'). Ja * wierzę * to jest również POSIX ... – ephemient

3

Prawdopodobnie chcesz egrep. Spróbuj:

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

Wygląda na to, że były na dobrej drodze ... The ^ charakter mecze rozpoczynających-of-line, a $ mecze end-of-line. Wzorzec Jonathana będzie działać dla ciebie ... po prostu chciałem dać ci wyjaśnienie za nim

+3

Jednak nie do końca na właściwym tropie. Ważne jest, aby zauważyć, że znaki wewnątrz klasy znaków [] 'zachowują się znacząco inaczej niż w innych częściach wyrażenia regularnego. – ephemient

1

Czy przetwarzasz dane wyjściowe ls -l?

Jeśli jesteś, a ty po prostu chcesz dostać nazwę pliku

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

Jeśli nie masz wyboru, bo usrLog.txt tworzony jest przez coś/kogoś innego i absolutnie trzeba użyć tego pliku, inne opcje obejmują

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

Ruby (1.9+)

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

atakujących

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

Należy zauważyć, że nie tylko karetka (^) zachowuje się inaczej w nawiasach klamrowych, ale będzie miała przeciwny skutek umieszczenia jej poza nawiasami. Umieszczenie karetki tam, gdzie ją masz, spowoduje wyszukanie wszystkich napisów NIE zaczynających się od treści umieszczonej w nawiasach. Również chciałbyś umieścić kropkę przed gwiazdką pomiędzy nawiasami, tak jak w grep, działa ona również jako "wieloznacznik".

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

To powinno działać dla ciebie, zauważyłem, że niektóre plakaty używane klasę postaci w ich ekspresji, która jest skuteczną metodą, jak również, ale nie używali każdy w swojej oryginalnej ekspresji więc staram się uzyskać jeden tak blisko Ciebie jak to możliwe, wyjaśniając każdą drobną zmianę po drodze, aby była lepiej zrozumiana. Jak możemy nauczyć się czegoś innego?

Powiązane problemy