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

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

Path=fy2tbaj8.default-1404984419419

Я хочу печатать только символы после Path=, я пытался grep Path filename | head -5, Но это не работает. Это все еще показывает всю линию. Как я могу это сделать?

6 ответов

Решение

Ты можешь использовать cut Команда для этого.

grep Path filename |cut -c6-

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

Ты можешь использовать 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)

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

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

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

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

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

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

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

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

IHTH

С GNU grep:

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

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

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

Ты ищешь sed или же awk:

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

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

Конечно, решение заключается в использовании 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
Другие вопросы по тегам