Zakładając, że chcesz dopasować całą linię do swojego wzoru, z GNU sed
, działa to:
sed -n '/^dog 123 4335$/ { :a; n; p; ba; }' infile
Standardowy odpowiednik:
sed -ne '/^dog 123 4335$/{:a' -e 'n;p;ba' -e '}' infile
Z następującymi danymi wejściowymi ( infile
):
cat 13123 23424
deer 2131 213132
bear 2313 21313
dog 123 4335
cat 13123 23424
deer 2131 213132
bear 2313 21313
Dane wyjściowe to:
cat 13123 23424
deer 2131 213132
bear 2313 21313
Wyjaśnienie:
/^dog 123 4335$/
szuka żądanego wzoru.
:a; n; p; ba;
to pętla, która pobiera nowy wiersz z input ( n
), drukuje go ( p
) i rozgałęzia z powrotem, aby oznaczyć a :a; ...; ba;
.
Aktualizacja
Oto odpowiedź, która zbliża się do twoich potrzeb, tj. Wzorzec w pliku 2, grepowanie z pliku 1:
tail -n +$(( 1 + $(grep -m1 -n -f file2 file1 | cut -d: -f1) )) file1
Osadzony grep i cut znajdują pierwszą linię zawierającą wzór z pliku2, ten numer linii plus jeden jest przekazywany do ogona, plus jeden służy do pominięcia linii ze wzorem.
Jeśli chcesz zacząć od ostatniego meczu zamiast pierwszego, byłoby to:
tail -n +$(( 1 + $(grep -n -f file2 file1 | tail -n1 | cut -d: -f1) )) file1
Pamiętaj, że nie wszystkie wersje ogona obsługują notację plusa.