Подтвердить что ты не робот

Греп для начала и конца строки?

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

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

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

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

Вероятно, вам нужен egrep. Попробуйте:

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

Ответ 5

Вы анализируете вывод 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

Ответ 6

На этот вопрос предоставлено много ответов. Просто хотел добавить еще один, который использует bashism-

#! /bin/bash
while read -r || [[ -n "$REPLY" ]]; do
[[ "$REPLY" =~ ^(-rwx|drwx).*[[:digit:]]+$ ]] && echo "Got one -> $REPLY"
done <"$1"

@kurumi ответ для bash, который использует регистр также правильно, но он не будет читать последнюю строку файла, если в конце нет последовательности новой строки (просто сохраните файл, не нажимая "Enter/Return" в последней строке) ,