Ignoriere die ersten N Übereinstimmungen und drucke die (N+1)te Übereinstimmung in grep

Ignoriere die ersten N Übereinstimmungen und drucke die (N+1)te Übereinstimmung in grep

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 N10 ist, verwenden Sie , tail +11um 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

patternStellen Sie sicher, dass Sie nach Bedarf , N, und ausfüllen K.

Der erste Block protokolliert jedes Mal, wenn das Muster gefunden wird. Sobald der NSchwellenwert überschritten wird, beginnt der zweite Block mit dem Drucken jeder Zeile. Der zweite Block stoppt den Druckvorgang, sobald der KSchwellenwert 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 cbeispielsweise die Anzahl 3 erreicht wird, wird ein Flag ( d) gesetzt und die Anzahl der Zeilen danach ( k=2) festgelegt. d && k--&&k>=0Bedeutet, dass die Zeilen gedruckt werden, solange k der Wert größer 0oder kleiner als ist 2.

Antwort4

grep 'PATTERN' FILENAME | tail -n +M

wo Mist N+1

verwandte Informationen