Как заставить grep не отображать искомую строку? [Дубликат]

После удаления можно изменить пароль. Вам нужно просто загрузиться в режиме восстановления. Здесь вы найдете хороший учебник: http://www.psychocats.net/ubuntu/resetpassword

Короче, что вы найдете по ссылке выше:

у вас есть для перезагрузки в режиме восстановления. (чтобы меню загрузки было показано, вы должны удерживать клавишу Shift во время загрузки). В загрузочном меню выберите вариант «Drop to root shell prompt» на консоли один за другим
ls /home
passwd username
passwd susan
exit
, затем перезагрузите обычный
1
задан 29 September 2014 в 20:19

5 ответов

Вы можете использовать grep и только grep:

grep -oP "(?<=Path=).*" file

Объяснение:

Из man grep:

   -o, --only-matching
          Print only the matched (non-empty) parts of a matching line,
          with each such part on a separate output line.
   -P, --perl-regexp
          Interpret PATTERN as a Perl compatible regular expression (PCRE)

Lookbehind (?<=Path=) утверждает, что в текущей позиции в строке предшествует символ Path=. Если утверждение выполнено успешно, двигатель соответствует шаблону разрешения.

Для синтаксиса регулярных выражений Perl 5 прочитайте lookbehind .

29
ответ дан 24 May 2018 в 03:17

Решение awk - это то, что я хотел бы использовать, но немного меньший процесс для запуска - sed, и он может давать те же результаты, но заменяя PATH = часть строки на "", т. е. [ ! d0]

  sed -n 's/^Path=//p' file

-n переопределяет поведение sed по умолчанию «print all lines» (поэтому -n = нет печати), и для печати строки мы добавляем символ p после подстанция. Будут напечатаны только строки, в которых происходит замещение.

Это дает вам поведение, о котором вы просили, из grep ing для строки, но удаляет часть Path= строки.

Если, по словам Дэвида Фёрстера , у вас есть большой файл и вы хотите прекратить обработку, как только вы согласовали и напечатали первое совпадение с «Path =», вы можете сказать sed выйти с командой q. Обратите внимание, что вам нужно сделать его командой-группой, окружив оба в { ..} и разделив каждую команду на ;. Таким образом, расширенная команда:

sed -n 's/^Path=//{p;q;}` file

IHTH

6
ответ дан 24 May 2018 в 03:17
  • 1
    Сделайте это s/^Path=//p, так как мы хотим только совпадение в начале строки. Мы можем сопоставить только первое вхождение с s/^Path=//{p;q}. – David Foerster 29 September 2014 в 21:13
  • 2
    @DavidFoerster: Спасибо, за эти улучшения, я добавляю их в свой ответ. – shellter 29 September 2014 в 22:21

grep greped строка текста и отображает ее. head отображает первые n строк текста, а не символы.

Вы ищете sed или awk:

awk '{print $2}' FS='='

Это устанавливает = как разделитель полей и печатает второе поле.

5
ответ дан 24 May 2018 в 03:17
  • 1
    Разве не лучше использовать FS='PATH='? – don.joey 29 September 2014 в 19:55
  • 2
    Вы можете делать awk как «один лайнер», [F1] – Panther 29 September 2014 в 19:56
  • 3
    @ don.joey: Я бы использовал FS='=', чтобы вы могли использовать $1 («PATH»), когда это необходимо. – Jan 29 September 2014 в 20:04

С GNU grep:

$ echo Path=fy2tbaj8.default-1404984419419 | grep -oP '(Path=)\K.*'
fy2tbaj8.default-1404984419419

\K сохраняет материал слева от \ K, не включайте его в $&.

5
ответ дан 24 May 2018 в 03:17
  • 1
    Было бы лучше, если бы вы включили этот '(Path=)\K.*' в соответствии с OP. Я тоже смотрел эту команду. \K хороший вариант. Благодарю. upvoted – αғsнιη 30 September 2014 в 13:23
  • 2
    @KasiyA: Обновлено. Не стесняйтесь редактировать все, что, по вашему мнению, лучше. – cuonglm 30 September 2014 в 13:27
  • 3
    @KasiyA почему скобки? Они не делают ничего полезного там, это делает то же самое: grep -oP 'Path=\K.*' – terdon♦ 1 October 2014 в 04:51
  • 4
    @terdon: Как я думаю, он хочет подчеркнуть ту роль, которую OP не хочет. – cuonglm 1 October 2014 в 06:25

Конечно, решение состоит в использовании grep -Po.

Давайте добавим некоторые решения для полноты:

с cut, установив разделитель =:
cut -d'=' -f2 file
Это может быть немного рискованно, но вы также можете указать файл, так что $Path будет содержать значение.
source file
echo "$Path"

Test

$ cat a
this=aaabbccc
that=dddeee
$ source a
$ echo "$this"
aaabbccc
$ echo "$that"
dddeee

В соответствии с комментариями см., как source только часть файла:

$ cat a
Path=22
Path=33
$ source a
$ echo $Path
33
$ source <(head -1 a)
$ echo $Path
22
1
ответ дан 24 May 2018 в 03:17
  • 1
    Если файл содержит больше строк, начинающихся с Path=, то каково ваше решение? он просто возвращает последний из них. – αғsнιη 29 September 2014 в 20:31
  • 2
    Это выходит за рамки вопроса, поскольку OP должен знать, где в файле находятся эти строки. Однако вы можете играть с source и head / tail. Например, source <(head -3 file), чтобы просто получить 3 первых строки файла и т. Д. – fedorqui 29 September 2014 в 20:34
  • 3
    Все еще возвращает последний – αғsнιη 29 September 2014 в 20:40
  • 4
    @ KasiyA, конечно, возвращает последний, поэтому я предлагаю использовать head / tail, чтобы получить блок кода, в котором он уникален. – fedorqui 29 September 2014 в 20:42
  • 5
    Я сказал, что все еще возвращает последний, также используя head/tail – αғsнιη 29 September 2014 в 20:44

Другие вопросы по тегам:

Похожие вопросы: