На этот вопрос уже есть ответ здесь:
Я хочу напечатать часть строки в файле. Вся линия выглядит так.
Path=fy2tbaj8.default-1404984419419
Я хочу печатать только символы после Path =
. Я пробовал grep Путь к файлу | голова -5
. Но он не работает. Он по-прежнему показывает всю строку. Как я могу это сделать?
можно использовать cut
команда с этой целью.
grep Path filename |cut -c6-
опция Here -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)
lookbehind (?<=Path=)
утверждает, что в текущей позиции в строке, что предшествует, символы Path=
. Если утверждение успешно выполняется, механизм соответствует шаблону разрешения.
Для синтаксиса регулярного выражения Perl 5, читайте страница справочника .
регулярных выражений Perl awk
решение - то, что я использовал бы, но немного меньший процесс для запуска sed
и это может привести к тем же результатам, но путем замены ПУТЕМ = часть строки с ""
, т.е.
sed -n 's/^Path=//p' file
-n
переопределения sed
s поведение по умолчанию 'печати все строки' (так -n
= никакая печать), и распечатать строку, мы добавляем p
символ после substition. Только строки, где замена происходит, будут распечатаны.
Это дает Вам поведение, из которого Вы попросили, grep
луг для строки, но удаление Path=
часть строки.
Если на комментарии David Foerster у Вас есть большой файл и желание прекратить обрабатывать, как только Вы соответствовали и распечатали первое соответствие для 'Соединения каналом =', можно сказать sed выходить, с q
команда. Обратите внимание, что необходимо сделать это оперативной группой штаба путем окружения обоих в { ..}
и разделяя каждую команду с a ;
. Таким образом, расширенная команда
sed -n 's/^Path=//{p;q;}` file
IHTH
Конечно, решение состоит в том, чтобы использовать 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
grep
власти строка текста и дисплеев это. head
дисплеи первое n строки текста, не символы.
Вы ищете sed
или awk
:
awk '{print $2}' FS='='
Это устанавливает =
как разделитель полей и печатает второе поле.
С GNU grep:
$ echo Path=fy2tbaj8.default-1404984419419 | grep -oP '(Path=)\K.*'
fy2tbaj8.default-1404984419419
\K
сохраняет материал оставленным \K, не включайте его в $&
.