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