Ich habe mein Glück versucht grep
und sed
irgendwie schaffe ich es nicht, es richtig zu machen.
Ich habe eine Protokolldatei mit einer Größe von ca. 8 GB. Ich muss einen Zeitraum von 15 Minuten verdächtiger Aktivitäten analysieren. Ich habe den Teil der Protokolldatei gefunden, den ich betrachten muss, und ich versuche, diese Zeilen zu extrahieren und in einer separaten Datei zu speichern. Wie würde ich das auf einem normalen CentOS-Computer machen?
Mein letzter Versuch war dies, aber es hat nicht funktioniert. Ich bin ratlos, wenn es um sed
diese Art von Befehlen geht.
sed -n '2762818,2853648w /var/log/output.txt' /var/log/logfile
command-line
sed
grep
koljanep
quelle
quelle
sed
, eine neue Datei zu erstellen, wenn keine vorhanden ist? Im Moment bekomme ichsed: can't read /var/log/output.txt: No such file or directory
. Ich kann natürlich nur eine Datei erstellen, aber zum Lernen möchte ich wissen, wie es automatisch geht./var/log/logfile
automatisch, wenn sie nicht vorhanden ist. Es wird es sogar ersetzen, wenn es bereits existiert. Der Punkt ist:/var/log/logfile
ist die Datei, die die gewünschten Zeilen enthält. Die Datei, aus der Sie lesen möchten, lautet/var/log/output.txt
: Ich habe gerade Ihr Beispiel kopiert. Anscheinend versuchen Sie, aus einer nicht vorhandenen Datei zu lesen . Sie sollten es durch den tatsächlichen Pfad ersetzen, in dem sich die zu lesende Protokolldatei befindet.Der wahrscheinlich beste Weg, dies zu tun, ist die Shell-Umleitung, wie andere erwähnt haben.
sed
Obwohl dies ein persönlicher Favorit ist, wird dies wahrscheinlich nicht effizienter als der Wille seinhead
- was darauf ausgelegt ist, nur so viele Zeilen aus einer Datei zu erfassen.Es gibt andere Antworten auf dieser Site, die nachweislich zeigen, dass große Dateien jedes Mal
head -n[num] | tail -n[num]
eine Outperformance erzielensed
, aber wahrscheinlich sogar noch schneller, als die Pipe insgesamt zu meiden.Ich habe eine Datei erstellt wie:
Und ich habe es durchlaufen:
Ich
sed
habe dort überhaupt nur die erste und letzte Zeile genommen, um Ihnen zu zeigen ...Dies funktioniert, da beim Gruppieren von Befehlen mit
{ ... ; }
und Umleiten der Eingabe für die Gruppe... ; } <input
alle Eingaben dieselbe Eingabe haben. Die meisten Befehle erschöpfen die gesamte Datei, während sie gelesen werden. In einem{ cmd1 ; cmd2; } <infile
Fall wird normalerweisecmd1
vom Kopf der Datei bis zu ihrem Ende gelesen undcmd2
es verbleibt keine.head
wird jedoch immer nur so weit durch seine Infile suchen, wie es angewiesen ist, und so in einem ...... Fall, dass der erste
[num]
seine Ausgabe durchsucht und ausgibt/dev/null
und der zweite übrig bleibt, um mit dem Lesen dort zu beginnen, wo der erste ihn verlassen hat.Du kannst tun...
Dieses Konstrukt funktioniert auch mit anderen Arten von zusammengesetzten Befehlen. Zum Beispiel:
... was druckt ...
Es könnte aber auch so funktionieren:
Über der Shell werden die Variablen
$n
und zunächst$d
auf ... gesetzt.$n
wc
für meine Testdatei angegeben/tmp/5mil_lines
$d
$n/43
wobei 43 nur ein willkürlich ausgewählter Divisor ist.Es werden dann Schleifen, um die
until
es auf einen Wert weniger dekrementiert$n
wurde$d
, wiederholt$d
. Dabei speichert es seinen Split-Count in$s
und verwendet diesen Wert in der Schleife, um die benannte>
Ausgabedatei aufzurufen/tmp/[num].split
. Das Ergebnis ist, dass\n
für jede Iteration eine gleiche Anzahl von durch E-Zeilen getrennten Feldern in der Infile in eine neue Outfile ausgelesen wird, die im Verlauf der Schleife 43-mal gleichmäßig aufgeteilt wird. Es verwaltet es, ohne seine Infile mehr als zweimal lesen zu müssen - das erste Mal ist, wannwc
es seine Zeilen zählt, und für den Rest des Vorgangs liest es jedes Mal nur so viele Zeilen, wie es in die Outfile schreibt.Nachdem ich es ausgeführt hatte, überprüfte ich meine Ergebnisse wie ...
AUSGABE:
quelle
tac
müsste die ganze Datei essen - genau wietail
ich denke - aber ich würde denken, wenn Sie dashead
Ding zuerst machen, sollten Sie in der Lage sein, nur den letzten Teil der Datei umzukehren. Passiert das nicht? Entschuldigung, das hat mich nur überrascht. Aber wenn man es immer mehr betrachtet, ist es eine interessante Idee.strace
. Oh, warte eine Minute -tac
muss stdin testen, um nach einer suchbaren Eingabe zu suchen und den Deskriptor zurückzuspulen - es ist das einzige, was für mich Sinn macht. Ich werde es aber überprüfenstrace
. Das wäre übrigens schlechtes Benehmen, denke ich.lseek()
:[pid 6542] lseek(0, 0, SEEK_END) = 551 [pid 6542] ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0x7fff51f3a940) = -1 ENOTTY (Inappropriate ioctl for device) [pid 6542] lseek(0, 0, SEEK_END) = 551 [pid 6542] lseek(0, 0, SEEK_SET) = 0
- an sich kein schlechtes Verhalten, wenn man bedenkt, wastac
zu tun ist, aber abnormal und im Gegensatz zu dem, was die Standarddienstprogramme tun sollten.sed
da draußen, die nicht unterstützenw
? Die akzeptierte Antwort macht so ziemlich dasselbe nur mitp
und>
... macht keinen Sinn ...Sie könnten wahrscheinlich dies mit Hilfe erreichen
head
undtail
Befehlskombinationen wie unten.Ersetzen Sie das
from_line_number
undto_line_number
durch die gewünschten Zeilennummern.Testen
quelle