Istnieje skrypt (nazwijmy go echoer
), który drukuje, aby przejrzeć mnóstwo informacji. Chciałbym widzieć linie tylko po znalezieniu wzoru.
Wyobrażam sobie zastosowanie rozwiązania, które mogłoby wyglądać podobnie
echoer | solution_command <pattern>
Idealnie pattern
byłoby wyrażenie regularne, ale ciągi twardej wartości byłyby dla mnie wystarczające.
Odpowiedzi:
AWK może to zrobić z zakresami wzorców, co pozwala na użycie dowolnego wyrażenia regularnego:
wypisze
echoer
wyjście, zaczynając od dopasowania pierwszego wierszapattern
.AWK jest oparte na wzorcach i jest zwykle używane z podejściem typu „jeśli ten wzór pasuje, zrób to”. „Ten wzór” może być zakresem wzorów, zdefiniowanym jako „kiedy ten wzór pasuje, zacznij to robić, aż ten inny wzór się dopasuje”; jest to określone przez napisanie dwóch wzorów oddzielonych przecinkiem, jak powyżej. Wzory mogą być dopasowanymi tekstami, tak jak w
/pattern/
przypadku, gdy bieżący wiersz jest sprawdzany względem wzorca, interpretowany jako wyrażenie regularne; mogą być również wyrażeniami ogólnymi, ocenianymi dla każdego wiersza i uznanymi za zgodne, jeśli ich wynik jest niezerowy lub niepusty.W AWK domyślną akcją jest wydrukowanie bieżącej linii.
Łącząc to wszystko,
awk '/pattern/,0'
szuka linii pasującychpattern
, a gdy je znajdzie, stosuje domyślną akcję do wszystkich linii, dopóki0
warunek się nie zgadza (jest różny od zera).awk '/pattern/,""'
też by działał.Podręcznik Gawk jest o wiele bardziej szczegółowy.
źródło
0
? Czy by to/pattern/,/0/
bylo Jak wyglądałaby odpowiedź jednoznacznie zapisująca akcję domyślną?/pattern/,/0/
drukowałby, dopóki nie znajdzie linii (rekordu) zawierającego „0”. Zapisanie fragmentu w odpowiedzi za pomocą jawnej akcji daje/pattern/,0 { print $0 }
lub równoważnie/pattern/,0 { print }
.Obowiązkowy
sed
odpowiednik @ StephenKittawk
:pattern
jest interpretowane jako podstawowe wyrażenie regularne jak wgrep
(w przeciwieństwie do rozszerzonego wyrażenia regularnego wawk
/egrep
/grep -E
). Niektóresed
implementacje mają opcję-E
(BSD, ast, ostatnie GNU / busybox, wkrótce POSIX) lub-r
(GNU, ssed, busybox, niektóre ostatnie BSD), aby zamiast tego rozszerzyć wyrażenia regularne, a niektóre mają-P
(ast) lub-R
(ssed), aby to zrobić wyrażenie regularne podobne do perla.Z
perl
:źródło
z GNU i * BSD grep:
O ile plik nie zawiera więcej niż 1 mln linii, to wszystko.
źródło
Jeśli używasz pagera, na przykład
less
do wyświetlania danych wyjściowych poleceniaźródło
awk
dla linii po pierwszym dopasowaniu wzorca (ale bez niego)Jeśli linia zawierająca wzorzec wyzwalający jest odpowiednikiem „CUT HERE”, możesz pominąć go na wydruku:
Każdy wiersz danych wejściowych przebiega przez dwa składniki w kodzie awk. Pierwszym składnikiem jest
flag
, który awk interpretuje jako „wypisz linię, jeśli zmiennaflag
jest niezerowa”. Ponieważ zmienne awk mają domyślnie wartość 0, początkowo nic nie wydrukuje.Drugi składnik,
/pattern/ { flag=1 }
ustawia flagę na 1, gdy tylko wykryje wzorzec, a flaga zachowuje tę wartość do końca cyklu.Do czasu pierwszego wykrycia wzoru minęła możliwość wydrukowania tego wiersza wprowadzania. Zostaną wydrukowane wszystkie kolejne wiersze (w tym dodatkowe wiersze zawierające wzór).
źródło
Grzmotnąć
Trochę niezgrabne, ale działa.
Ta wersja polega na
cat
, ale jest łatwiejsza do zrozumienia.źródło