Как команда 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