te%20%C3%9Cbereinstimmung%20in%20grep.png)
Wie kann ich grep dazu bringen, die ersten N Übereinstimmungen in einer Datei zu ignorieren, dann die (N+1)te Übereinstimmung und alle k Zeilen danach auszudrucken und anschließend zu beenden?
Antwort1
Leiten Sie das Ergebnis einfach weiter antail(1)
. Wenn beispielsweise N
10 ist, verwenden Sie , tail +11
um die ersten 10 Übereinstimmungen zu überspringen:
grep pattern file | tail +11
Antwort2
Eine alternative Lösung in awk
:
awk '/pattern/ { found++ } found > N && printed <= K { print; printed++ }' file
Besser lesbar:
awk '
# Initialize to zero for clarity
BEGIN {
found = 0
printed = 0
}
# Check for a pattern match
/pattern/ {
found++
# Found one match
}
# Check if it's the right time to print
found > N && printed <= K {
print
printed++
# Printed once
}' file
pattern
Stellen Sie sicher, dass Sie nach Bedarf , N
, und ausfüllen K
.
Der erste Block protokolliert jedes Mal, wenn das Muster gefunden wird. Sobald der N
Schwellenwert überschritten wird, beginnt der zweite Block mit dem Drucken jeder Zeile. Der zweite Block stoppt den Druckvorgang, sobald der K
Schwellenwert erreicht ist.
Antwort3
Sie können verwendenawk
awk 'd && k--&&k>=0; c>=3 && /pattern/{d=1;k=2} /pattern/{c++};' file
Zuerst wird der Wert jedes Mal /3/{c++}
erhöht c
, wenn er mit dem Muster übereinstimmt. Wenn c
beispielsweise die Anzahl 3 erreicht wird, wird ein Flag ( d
) gesetzt und die Anzahl der Zeilen danach ( k=2
) festgelegt. d && k--&&k>=0
Bedeutet, dass die Zeilen gedruckt werden, solange k
der Wert größer 0
oder kleiner als ist 2
.
Antwort4
grep 'PATTERN' FILENAME | tail -n +M
wo M
ist N+1