example.txt jest poniżej
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
Używam skryptu bash i powiedzmy, że chcę wyszukać restaurację według jej nazwy z powyższego pliku. Poproś użytkownika o podanie nazwy restauracji, a powinna wydrukować informacje dotyczące tej restauracji (5 wierszy).
awk '/McDonalds/> /KFC/' example.txt
Wiem, że powyższy wiersz kodu wydrukuje całą linię pasującą do wzorca „McDonalds” i „KFC”, ale to po prostu wydrukuje pierwszy wiersz z pliku tekstowego, ale nie resztę informacji o tej restauracji. Jak mogę nakazać wydrukowanie wszystkich informacji (5 linii) z samego wpisu nazwy restauracji?
Używanie
sed
:Wyjaśnienie
Jest to podstawowa
sed
funkcja, możesz odnieść PRZYDATNE SKRZYDŁA W JEDNEJ LINII DO SEDźródło
Powyższe polecenie pobierze i wydrukuje kolejne 4 linie wraz z bieżącą linią, ponieważ zostało wprowadzone do pętli for. Wzorzec wyszukiwania
$2=="KFC"
pomoże uzyskać konkretną linię z wielu linii.źródło
Inne możliwe rozwiązanie:
źródło
{if($1=="KFC")print $0}
Można kondensować się po prostu$1 == "KFC"
, ponieważ domyślna akcja dla prawdziwego stanu jest, aby wydrukować zapis.Wystarczy wydrukować z wiersza zawierającego żądaną nazwę, aż do ostatniego wiersza zawierającego słowo
Phone
(zakładając oczywiście, że wszystkie wpisy mają ten sam wzór i zawsze będą miałyPhone
zapis kończący)Gdybyśmy chcieli trochę to skomplikować, moglibyśmy wydrukować dokładnie 5 linii po meczu, w ten sposób:
stop
Zmienna nie zostanie ustawiona, więcNR<=stop
nie będzie niczego drukować, aż/McDonalds/{stop=NR+5;}
część faktycznie ustawia zmienną, a to nastąpi tylko wtedy, gdy znajdziemy mecz.źródło