Ich habe eine lange Liste von IP-Adressen, die nicht der Reihe nach sind. Ich muss herausfinden, wie viele IP-Adressen vor / nach einer bestimmten IP-Adresse vorhanden sind. Wie kann ich das erreichen?
shell-script
text-processing
Mandar Shinde
quelle
quelle
Antworten:
Anzahl der Zeilen vor und nach einer Übereinstimmung, einschließlich der Übereinstimmung (dh Sie müssen 1 vom Ergebnis abziehen, wenn Sie die Übereinstimmung ausschließen möchten):
Dies hat jedoch insbesondere nichts mit IP-Adressen zu tun.
quelle
Vielleicht ist das einfachste,
Vielen Dank an @JoshepR für den Hinweis auf den Fehler
quelle
dc
wahrscheinlich direkt an mich selbst weiterleiten .Ich habe das auf zwei Arten gemacht, obwohl ich denke, dass mir das am besten gefällt:
Das speichert all diese als aktuelle Shell-Variablen - und wertet sie anschließend in der for-Schleife für die Ausgabe aus. Es zählt die Gesamtzahl der Zeilen in der Datei mit
wc
und erhält die erste übereinstimmende Zeilennummer mitsed
.Seine Ausgabe:
Ich habe auch getan:
sed
druckt nur übereinstimmende und letzte Zeilennummern undtr
übersetzt dann die dazwischen liegenden\n
Zeilen inundread
liest die erstensed
Ergebnisse in$ml
und alle anderen in$ll
. Mögliche Fälle mit mehreren Übereinstimmungen werden behandelt, indem alle bis auf das letzte Ergebnis aus der$ll
Erweiterung entfernt werden, wenn sie später erneut festgelegt werden.Seine Ausgabe:
Beide Methoden wurden an der auf folgende Weise generierten Datei getestet:
Nach Zeilennummer:
"$IP"
dann eine\n
Ewlinetr
- übersetzt Nullen in\n
ewlines und dann in~/file
quelle
Hier ist ein bisschen Perl-Code, der das macht:
Dies zählt die Gesamtzahl der Zeilen vor und nach der Zeile, die die IP enthält
192.168.1.1
. Ersetzen Sie durch Ihre gewünschte IP.Verwenden Sie nur Bash:
quelle
$.
anstelle eines Zählers?$after
auf$. - $before
.$. - 1
, speichern$.
unter$tmp
. Druck beenden$. - $tmp
. Wir brauchen also keinen Zähler für vorher und nachher. Natürlich ist es weniger lesbar als deins.Ich habe die folgenden Befehle ausprobiert, die etwas kompliziert sind, aber genaue Ergebnisse liefern würden:
Nach dem:
Vor:
quelle
Eine
awk
Lösung, die die Anzahl der Zeilen vor und nach dem letzten Spiel angibtquelle
Grep
hat eine Funktion, die zählen kann, wie oft ein bestimmtes Muster gefunden wird. Wenn Sie den-c
Befehl verwenden, wird dies getan. Mit dem-c
und-v
Befehl, diese zählen , wie oft dies nicht ein bestimmtes Muster übereinBeispiel:
grep -c -v <pattern> file
Also, wenn Sie etwas versuchen wie:
grep -c -v 192.168.x.x file.log
das sollte funktionieren.quelle