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

На этот вопрос уже есть ответ здесь:

Я хочу напечатать часть строки в файле. Вся линия выглядит так.

Path=fy2tbaj8.default-1404984419419

Я хочу печатать только символы после Path = . Я пробовал grep Путь к файлу | голова -5 . Но он не работает. Он по-прежнему показывает всю строку. Как я могу это сделать?

8
задан 29 September 2014 в 19:19

6 ответов

можно использовать cut команда с этой целью.

grep Path filename |cut -c6-

опция Here -c6- означает печать от 6-го до последнего знака.

12
ответ дан 16 November 2019 в 16:42

Можно использовать grep и всего grep:

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

enter image description here

Объяснение :

От 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, читайте страница справочника .

регулярных выражений Perl
30
ответ дан 16 November 2019 в 16:42

awk решение - то, что я использовал бы, но немного меньший процесс для запуска sed и это может привести к тем же результатам, но путем замены ПУТЕМ = часть строки с "" , т.е.

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

-n переопределения seds поведение по умолчанию 'печати все строки' (так -n = никакая печать), и распечатать строку, мы добавляем p символ после substition. Только строки, где замена происходит, будут распечатаны.

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

Если на комментарии David Foerster у Вас есть большой файл и желание прекратить обрабатывать, как только Вы соответствовали и распечатали первое соответствие для 'Соединения каналом =', можно сказать sed выходить, с q команда. Обратите внимание, что необходимо сделать это оперативной группой штаба путем окружения обоих в { ..} и разделяя каждую команду с a ;. Таким образом, расширенная команда

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

IHTH

6
ответ дан 16 November 2019 в 16:42

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

Позволяют нам добавить некоторые другие решения, для полноты:

  • с cut, устанавливая разделитель =:

    cut -d'=' -f2 file
    
  • Это могло бы быть немного опасно, но Вы можете также источник файл, так, чтобы $Path содержал значение.

    source file
    echo "$Path"
    

Тест

$ 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
ответ дан 16 November 2019 в 16:42

grep власти строка текста и дисплеев это. head дисплеи первое n строки текста, не символы.

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

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

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

5
ответ дан 16 November 2019 в 16:42

С GNU grep:

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

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

4
ответ дан 23 November 2019 в 05:21

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

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