example.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 -n '/KFC/,/^$/p' file
Restaurant: KFC
City: NYC
State: NY
Address: 123 Madison Square
Phone: 911
$ sed -n '/McDo/,/^$/p' file
Restaurant: McDonalds
City: Miami
State: Florida
Address: 123 Biscayne Blvd
Phone: 911
Это основная функция sed, вы можете обратиться к ПОЛЕЗНЫМ ОДНОМЛЕТНЫМ SCRIPTS ДЛЯ SED
$ awk '$2=="KFC" {print; for(i=1; i<=4; i++) { getline; print}}' example.txt
Restaurant: KFC
City: NYC
State: NY
Address: 123 Madison Square
Phone: 911
Вышеприведенная команда получит и распечатает последовательные 4 строки вместе с текущей строкой, потому что она была введена в цикл for. Шаблон поиска $2=="KFC" поможет получить определенную строку из нескольких строк. [ ! d0]
Другое возможное решение:
awk 'BEGIN{FS="\n";RS="\n\n"}{if($1=="KFC")print $0}' example.txt
Достаточно напечатать строку, содержащую нужное имя, до последней строки, содержащей слово Phone (предполагая, конечно, что все записи соответствуют одному и тому же шаблону и всегда будут иметь Phone как завершающую запись) 0]
$> awk '/5 guys/,/Phone/' restaurants.txt
Restaurant: 5 guys
City: Atlanta
State: Georgia
Address: 123 Peachtree Rd
Phone: 911
$> awk '/McDonalds/,/Phone/' restaurants.txt
Restaurant: McDonalds
City: Miami
State: Florida
Address: 123 Biscayne Blvd
Phone: 911
Если бы мы немного усложнили его, мы могли бы напечатать ровно 5 строк после совпадения:
awk '/McDonalds/{stop=NR+5}; NR<=stop ' restaurants.txt
Restaurant: McDonalds
City: Miami
State: Florida
Address: 123 Biscayne Blvd
Phone: 911
Переменная stop не будет установлена, поэтому NR<=stop ничего не печатает, до тех пор, пока /McDonalds/{stop=NR+5;} часть не установит переменную, и это произойдет только тогда, когда мы найдем совпадение.