Пример.txt ниже
Restaurant: McDonalds
City: Miami
State: Florida
Address: 123 Biscayne Blvd
Phone: 911
Restaurant: 5 guys
City: Atlanta
State: Georgia
Address: 123 Peachtree Rd
Phone: 911
Restaurant: KFC
City: NYC
State: NY
Address: 123 Madison Square
Phone: 911
Я использую скрипт bash и, скажем, я хочу найти ресторан по его названию из файла выше. Попросите пользователя ввести название ресторана, и он должен напечатать информацию об этом ресторане (5 строк).
awk '/McDonalds/> /KFC/' example.txt
Я знаю, что строка кода выше будет печатать всю строку, которая соответствует шаблону «McDonalds» и «KFC», но это будет просто печатать 1-ю строку из текстового файла, но не остальную информацию об этом ресторане. Как я могу сказать ему распечатать всю информацию (5 строк) только из пользовательского ввода названия ресторана?
Использование
sed
:объяснение
Это основная
sed
функция, вы можете сослаться на ПОЛЕЗНЫЕ ОДНО-ЛИНИЙНЫЕ СКРИПТЫ ДЛЯ САСисточник
Приведенная выше команда получит и напечатает 4 последовательные строки вместе с текущей строкой, поскольку она была передана в цикл for. Шаблон поиска
$2=="KFC"
поможет получить определенную строку из нескольких строк.источник
Другое возможное решение:
источник
{if($1=="KFC")print $0}
Может конденсироваться просто$1 == "KFC"
, так как действие по умолчанию для истинного состояния является печать записи.Достаточно напечатать от строки, содержащей желаемое имя, до последней строки, содержащей слово
Phone
(при условии, конечно, что все записи следуют одному и тому же шаблону и всегда будут иметьPhone
завершающую запись)Если мы хотим немного усложнить это, мы можем напечатать ровно 5 строк после матча, например:
stop
Переменная не будет установлена, так чтоNR<=stop
ничего не будет печатать, пока/McDonalds/{stop=NR+5;}
часть фактически не устанавливает переменную, и что будет происходить только тогда , когда мы находим матч.источник