2011-01-25 4 views
38

У меня есть файл, где я хочу grep для строк, начинающихся с -rwx или drwx И заканчивается в любом количестве.Grep для начала и конца строки?

У меня есть это, но это не совсем правильно. Есть идеи?

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

ответ

39

Сложная часть представляет собой регулярное выражение, которое включает тире как один из допустимых символов в символьном классе. Черточка должна прибыть сразу после начала для (нормального) класса символов и сразу после каретки для отрицательного класса символов. Если вам нужна и квадратная скобка, то вам нужно закрыть квадратную скобку, а затем тире. К счастью, вам нужна только тире, поэтому выбранная нотация.

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

См: Regular Expressions и grep для POSIX-стандартных деталей.

+2

Или 'grep -x '[-d] rwx. * [0-9]''. – ephemient

+0

В Linux, да - или где используется GNU grep. Версия, которую я цитировал, будет работать на всех вариантах Unix, которые я бы представил, делает ее лучше. –

+2

'-x' - POSIX. Скобка после тире: '[[.-.] [.].]]' (Которая, предоставленная, менее читаема, чем '[] -]'). Я * верю * это тоже POSIX ... – ephemient

3

Возможно, вы захотите egrep. Попробуйте:

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

Похоже, что вы были на правильном пути ... The ^ характер матчей, начиная-линии, и $ матчи конца-строки. Образец Джонатана будет работать на вас ... просто хотел дать вам объяснение позади него

+3

Не совсем на правильном пути. Важно отметить, что символы внутри символьного класса '[]' ведут себя значительно иначе, чем в других частях регулярного выражения. – ephemient

1

Вы анализируете вывод ls -l?

Если вы, и вы просто хотите, чтобы получить имя файла

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

Если у вас нет выбора, потому что usrLog.txt создается что-то/кто-то еще, и вы обязательно должны использовать этот файл, другие варианты включают в себя

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

Рубин (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

Следует отметить, что каретка (^) не только ведет себя по-разному в скобках, она будет иметь противоположный результат размещения ее вне скобок. Размещение каретки, где у вас есть, будет искать все строки НЕ начиная с содержимого, которое вы разместили в скобках. Вы также хотели бы разместить период перед звездочкой между вашими скобками, как с grep, а также действовать как «подстановочный знак».

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

Это должно работать для вас, я заметил, что некоторые плакаты использовали класс символов в своих выражениях, является эффективным методом, как хорошо, но вы не используете какой-либо в исходном выражении, так что я пытаюсь получить один как можно ближе к вашему, объясняя каждое незначительное изменение на этом пути, чтобы оно было лучше понято. Как мы можем учиться иначе?