Wenn ich tail
eine 25 GB große Textdatei haben möchte, liest der tail
Befehl dann die gesamte Datei?
Da eine Datei auf einer Festplatte verstreut sein könnte, stelle ich mir das vor, aber ich verstehe solche Interna nicht gut.
Nein, tail
es wird nicht die gesamte Datei gelesen, es wird bis zum Ende gesucht und dann werden die Blöcke rückwärts gelesen, bis die erwartete Anzahl von Zeilen erreicht wurde. Anschließend werden die Zeilen in der richtigen Richtung bis zum Ende der Datei angezeigt und möglicherweise wird die Datei weiterhin überwacht Datei, wenn die -f
Option verwendet wird.
Beachten Sie jedoch, dass tail
es keine andere Wahl gibt, als die gesamten Daten zu lesen, wenn eine nicht suchbare Eingabe bereitgestellt wird, beispielsweise beim Lesen aus einer Pipe.
Wenn Sie aufgefordert werden, nach Zeilen zu suchen, die am Anfang der Datei beginnen, wird bei Verwendung der tail -n +linenumber
Syntax- oder tail +linenumber
Nicht-Standardoption tail
(sofern unterstützt) offensichtlich die gesamte Datei gelesen (sofern nicht unterbrochen).
tail +n
wird die gesamte Datei gelesen - zuerst, um die gewünschte Anzahl von Zeilenumbrüchen zu finden, dann, um den Rest auszugeben.tail
Implementierungen dies tun oder ordnungsgemäß ausführen. Zum Beispiel ist busybox 1.21.1tail
in dieser Hinsicht defekt. Beachten Sie auch, dass sich das Verhalten ändert, wenntail
stdin und stdin eine reguläre Datei ist und die anfängliche Position in der Datei nicht am Anfang steht, wenntail
aufgerufen wird (wie in{ cat > /dev/null; tail; } < file
)Du hättest sehen können, wie es
tail
funktioniert. Wie Sie für eine meiner Dateien können,read
wird dreimal ausgeführt und insgesamt werden ungefähr 10 KByte gelesen:quelle
strace
Zeigt an, was Systemaufrufe beim Ausführentail
tun. Einige Informationen zu Systemaufrufen finden Sie hier en.wikipedia.org/wiki/System_call . Kurz - öffnen - öffnet eine Datei und gibt ein Handle zurück (3 in diesem Beispiel),lseek
Positionen, an denen Sie lesen undread
gerade lesen werden, und wie Sie sehen können, gibt es zurück, wie viele Bytes gelesen werden,Wie Sie jetzt wissen,
tail
sucht nur das Ende der Datei (mit dem Systemaufruflseek
) und arbeitet rückwärts. Aber in der oben zitierten Bemerkung fragen Sie sich: "Woher weiß Tail, wo auf der Festplatte das Ende der Datei zu finden ist?"Die Antwort ist einfach: Schwanz weiß es nicht. Bei Prozessen auf Benutzerebene werden Dateien als kontinuierliche Streams betrachtet, sodass
tail
nur der Versatz vom Dateianfang bekannt ist. Im Dateisystem ist der "Inode" (Verzeichniseintrag) der Datei jedoch mit einer Liste von Zahlen verknüpft, die den physischen Speicherort der Datenblöcke der Datei angeben. Wenn Sie aus der Datei lesen, ermittelt der Kernel / der Gerätetreiber, welches Teil Sie benötigen, ermittelt seinen Speicherort auf der Festplatte und holt es für Sie.Dafür haben wir Betriebssysteme: Sie müssen sich also keine Sorgen machen, wo die Blöcke Ihrer Datei verstreut sind.
quelle
Wenn
head
odertail
scheint , die gesamte Datei zu lesen, ist ein wahrscheinlicher Grund, dass die Datei wenige oder keine Zeilenumbrüche enthält . Ich bin vor ein paar Monaten darüber gestolpert, mit einem sehr großen (Gigabyte) JSON-Blob, der mit keinerlei Leerzeichen serialisiert wurde, nicht einmal in Strings.Wenn Sie GNU head / tail haben, können Sie
-c N
die ersten / letzten N Bytes anstelle von Zeilen ausgeben, dies ist jedoch leider keine POSIX-Funktion.quelle
Wie Sie in der Quelltextzeile 525 sehen können, sehen Sie die Kommentare zur Implementierung.
quelle