Jak mogę odczytać określoną liczbę wierszy po znalezieniu tekstu?
Na przykład.:
Czytaj kolejne 2 linie po znalezieniu „Unixa” na:
Test 1
Test 2
Test 3
Test 4
UNIX
Test 5
Test 6
Test 7
Test 8
Test 9
Wynik może być:
Test 5
Test 6
Uwaga: „Unix” w ostatnim przykładzie jest argumentem, więc może to być dowolny inny tekst.
Co ja mam:
Wciąż brakuje mi pomysłów, potrzebuję tylko światła. Zastanawiając się nad stworzeniem kolejnego skryptu, aby to zrobić.
$
znak na początku mojej odpowiedzi jest pytaniem powłoki, a nie częściąawk
polecenia.awk '/^UNIX$/ {s=NR;next} s && NR<=s+2'
grep
Rozwiązanie:Objaśnienie:
-A
oznacza: wydrukuj kolejne dwa wiersze po meczuLub
awk:
Objaśnienie: Ta instrukcja szuka UNIX w wierszu (
$0=="UNIX"
). Jeśli tak, pobiera następny do bufora (getline
) i drukuje bufor (print
). Odbywa się to dwukrotnie.Lub użyj
sed
:Objaśnienie: Wyszukuje dla UNIX (
/^UNIX$/
). Jeśli to zostanie znalezione, txecuts część w{...}
.n
oznacza następniep
oznacza druk. Odbywa się to również dwukrotnie.źródło
getline; print;
część wawk
instrukcji lubn;p;
część wsed
instrukcji.grep -A100 -P '^UNIX$' file | tail -n +2
. Część ogonowa polega na usunięciu pierwszego zastawu. W pozostałych (sed, awk) trzeba pisać pętle, co czyni to mniej prostym.Strona man grep opisuje opcję w ten sposób:
źródło
UNIX
dane wyjściowe.UNIX
, rury dotail
:[...] | tail -n +1
lubsed
:[...] | sed '1d'
.tail
ised '1d'
sugestie działają poprawnie tylko wtedy, gdyUNIX
pojawia się tylko raz w tekście wejściowym. Wszystkie pozostałe odpowiedzi pozwalają na wiele wystąpień. Lepiej byłoby zasugerować... | grep -v UNIX
. Wprawdzie robi się bałagan, jeśliUNIX
pojawia się w wierszach 15 i 17.sed
pomocą jakiejś formysed '/UNIX/d;n;n;p/' /path/to/file
, o której właśnie przesądziłem i podałem jako odpowiedź.Wydaje się, że robi to dobrze:
Dowód koncepcji:
źródło
for
pętli nie jest konieczna.Możesz użyć
ex
:gdzie:
1,/UNIX/d
- usuwa tekst po dopasowaniu%p
- drukuje buforq!
- wyjdź bez zapisywania zmian w pliku (użyjwq
do edycji w miejscu)źródło