Grep для начала и конца строки? - PullRequest
58 голосов
/ 26 января 2011

У меня есть файл, в котором я хочу использовать grep для строк, начинающихся с -rwx или drwx AND и заканчивающихся любым числом.

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

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

Ответы [ 5 ]

54 голосов
/ 26 января 2011

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

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

См. Регулярные выражения и grep для деталей стандарта POSIX.

25 голосов
/ 26 января 2011

Похоже, что вы на правильном пути ... Символ ^ соответствует началу строки, а $ соответствует концу строки. Шаблон Джонатана будет работать для вас ... просто хотел дать вам объяснение этого

5 голосов
/ 13 ноября 2013

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

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

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

3 голосов
/ 26 января 2011

Вы, вероятно, хотите egrep.Попробуйте:

egrep '^[d-]rwx.*[0-9]$' usrLog.txt
1 голос
/ 26 января 2011

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

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

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

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

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

Ruby (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...