Vijay's helpful sed
answer ist kurz, aber immer verarbeitet die gesamten Eingabedatei (und schafft auch zusätzliche Kindprozesse, weil wc -l
muss auch geltend gemacht werden - obwohl das wird kaum Materie insgesamt).
Versuchen Sie, die folgenden awk
Lösung, die verlässt, sobald das Ende des Bereichs gefunden wird (es schafft auch nur ein einziges Kind-Prozess - die Subshell weg zugunsten des einfachen awk
Befehl optimiert ist); mit großen Eingabedateien kann, diese Rolle, je nachdem, wo in der Datei der Bereich positioniert ist:
numlines=$(awk '/Iteration 1$/ {b=NR; next} /Iteration 2$/ {print NR-b-1; exit}' file)
Spitze des Hutes zu karakfa zu helfen, um den Befehl zu optimieren.
Hinweis: /Iteration 1$/
und /Iteration 2$/
sind reguläre Ausdrücke dass Matchstrings Iteration 1
und Iteration 2
am Ende einer Zeile ($
).
Die vorhandenen Zeichenfolgen enthalten keine Metazeichen für reguläre Ausdrücke, die zu escaping (mit \
) müssen, aber Sie müssen das in anderen Fällen möglicherweise tun.
Wenn die übereinstimmenden Strings nicht im Voraus Literale bekannt sind, wäre generisches Escaping schwierig; in diesem Fall, betrachten Ed Morton's solution, die auf Strings, nicht regulären Ausdrücken basiert.
Check-out http://stackoverflow.com/questions/38972736/how-to-select-lines-between-two- Muster zum Extrahieren der Linien zwischen den beiden Mustern (auch ohne die Muster) und weiterleiten an "wc" oder wahrscheinlich einen Zähler in "awk" Lösung selbst verwenden – Sundeep