Windows-Äquivalent zum Befehl 'tail'

107

Gibt es eine Möglichkeit, den Befehl * nix tail in der Windows-Befehlszeile zu simulieren ? Ich habe eine Datei und möchte eine Möglichkeit, die ersten n Textzeilen abzuschneiden. Beispielsweise:

D:\>type file.txt
line one
line two
line three
D:\>*[call to tail]* > result.txt

D:\>type result.txt
line two
line three
Chris Smith
quelle
10
Zeigt nicht headnur die ersten n Zeilen an, anstatt sie wegzulassen?
Joey
Bitte Chris, betrachte die neuen Antworten seit 2009, genauer gesagt die Antwort von Amit Portnoy . Da Ihre Frage allgemein ist, finden viele Benutzer diese Webseite möglicherweise. Und sie hören möglicherweise auf, die Antworten nach der ersten zu lesen: der Antwort, die Sie akzeptiert haben. Sie können die Antwort, die Sie akzeptiert haben, in eine andere ändern, die auf die heutigen Möglichkeiten aktualisiert wurde. Prost;)
Olibre
Ich bin ein bisschen verwirrt. Die ursprüngliche Frage betraf den headBefehl im Unix-Stil , aber die gewünschte Ausgabe schien zu fehlen tail. Es sieht so aus, als ob es um Antworten geht headund nicht tail.
Blakeoft
@ Blakeoft die ursprüngliche Frage war nach dem Verhalten von tail, jedoch der Titel sagtehead
MM
Mögliches Duplikat von Suche nach einem Windows-Äquivalent des Unix-Tail-Befehls
Álvaro González

Antworten:

89

Kein genaues Äquivalent. Es gibt jedoch einen nativen DOS-Befehl "more" mit der Option + n, der die Ausgabe der Datei nach der n-ten Zeile startet:

DOS-Eingabeaufforderung:

C:\>more +2 myfile.txt

Der obige Befehl gibt alles nach den ersten 2 Zeilen aus.
Dies ist eigentlich die Umkehrung von Unix head :

Unix-Konsole:

root@server:~$ head -2 myfile.txt

Mit dem obigen Befehl werden nur die ersten beiden Zeilen der Datei gedruckt.

Matthew Nizol
quelle
8
Nein, es ist nicht dasselbe. tailbeginnt mit dem Zählen ab dem Ende der Datei. So tail -2werden die letzten beiden Zeilen drucken.
ADTC
5
Kann ich auch die ersten n Zeichen drucken?
Qwerty
@ADTC (meine Version von) tail unterstützt keine Negative. nur Kopf tut (gnuwin32)
nl-x
@ nl-x -2ist kein Negativ. Es ist nur eine Kurzversion von -n 2(Anzahl der Zeilen). Leider unterstützen viel zu viele Implementierungen von tailnicht -2, was es sehr inkonsistent mit begleitenden headImplementierungen macht, die dies tun. Es hat mich zu oft geärgert.
ADTC
@ADTC Ah sorry. Ich war verwirrt mit dem, head -n -2was sich von unterscheidet head -n 2. Aber mit Schwanz existiert letzteres nicht.
nl-x
111

Wenn Sie Windows PowerShell installiert haben (ich denke, es ist seit XP enthalten), können Sie es einfach von cmd.exe aus ausführen:

Hauptbefehl:

powershell -command "& {Get-Content *filename* -TotalCount *n*}"

Heckbefehl:

powershell -command "& {Get-Content *filename* | Select-Object -last *n*}"

oder direkt von PowerShell:

Get-Content *filename* -TotalCount *n*
Get-Content *filename* | Select-Object -last *n*


aktualisieren

PowerShell 3.0 (Windows 8 und höher) hat einen TailBefehl mit Alias hinzugefügt Last. Headund FirstAliase zu TotalCountwurden ebenfalls hinzugefügt.

Befehle können also als neu geschrieben werden

Get-Content *filename* -Head *n*
Get-Content *filename* -Tail *n*
Amit Portnoy
quelle
Benimmt sich das nicht wie headstatt tail?
Blakeoft
@blakeoft ja, das hat es ... Ich habe meine Antwort aktualisiert. Es ist erstaunlich, dass es 2 Jahre und 17 Stimmen gedauert hat, bis jemand dies kommentiert hat.
Amit Portnoy
@blakeoft hat gerade festgestellt, dass die Frage bearbeitet wurde! (Siehe stackoverflow.com/posts/1295068/revisions). Es fragte ursprünglich nach dem Befehl head ... aktualisiert, um beide Antworten einzuschließen ...
Amit Portnoy
2
@AmitPortnoy Ich habe irgendwo auf diesem Stapelaustausch eine andere Antwort gefunden, die besagt, dass sie Get-Contentjetzt einen Endbefehl hat. Druckt beispielsweise Get-content -Tail 5 file.txtdie letzten fünf Zeilen der Datei file.txt. Vielen Dank für die Aktualisierung Ihrer Antwort übrigens.
Blakeoft
2
Wie kann man es als Filter verwenden? (zB stdin anstelle von Datei lesen)
eadmaster
24
more /e filename.txt P n

Dabei ist n die Anzahl der anzuzeigenden Zeilen. Funktioniert schnell und ist genau wie headBefehl.

Dan
quelle
14
Befehle wie P, S usw. können nur vom Benutzer an der Eingabeaufforderung eingegeben werden. Sie können nicht an den Befehl more übergeben werden. Daher funktioniert das obige Beispiel nicht
Philibert Perusse
17

Sie können CoreUtils von GnuWin32 erhalten , einer Sammlung von Standard-Unix-Tools, die auf Windows portiert sind.

Es enthält unter anderem Kopf.

Sebastian Paaske Tørholm
quelle
12

Dies ist ein totaler Hack, aber wenn es sich um eine riesige Datei handelt, bei der Sie nur das Format, den Header usw. untersuchen möchten und nach einer Lösung suchen, können Sie die "Mehr" -Ausgabe immer einfach in eine neue Datei und STRG-C umleiten schnell. Die Ausgabezeilen können nicht genau gesteuert werden, und Sie werden sie höchstwahrscheinlich in der Mitte einer Ausgabezeile beenden, aber es ist eine kostengünstige Möglichkeit, ein kleines Stück einer ansonsten unbrauchbaren Datei abzurufen.

Ex.

C: \ more test.csv> test.txt 
^ C. C: \ more test.txt
Zeile 1
Zeile 2
usw. ...... C: \
user2041301
quelle
9

Nun, das wird es tun , aber es ist ungefähr so ​​schnell wie es aussieht (ungefähr O (n * m), wobei n die Anzahl der anzuzeigenden Zeilen und m die Gesamtzahl der Zeilen in der Datei ist):

for /l %l in (1,1,10) do @for /f "tokens=1,2* delims=:" %a in ('findstr /n /r "^" filename ^| findstr /r "^%l:"') do @echo %b

Dabei ist "10" die Anzahl der Zeilen, die Sie drucken möchten, und "Dateiname" der Name der Datei.

brianary
quelle
6
+1 für eine Lösung, deren Eingabe länger dauerte als das Herunterladen eines Ports von head.
Camilo Martin
1
Hinweis: Setzen Sie diesen Ausdruck in Klammern - (expr) > out.txt-, wenn Sie die Ergebnisse an eine Datei senden, da sonst nur die letzte Zeile angezeigt wird. Oder anhängen - expr >> out.txt.
cz
9

Power Shell:

Get-Content C:\logs\result.txt -Tail 10

Get-Content C:\logs\result.txt -wait (monitor the tail)
Manuel Alves
quelle
Dies ist die richtige Antwort, aktuell und relevant (im Gegensatz zu cmd). Vielen Dank.
Cudacoder
7

Wenn Sie mehr + n verwenden, als Matt bereits erwähnt hat, versuchen Sie Folgendes, um Pausen in langen Dateien zu vermeiden:

mehr +1 myfile.txt> con

Wenn Sie die Ausgabe von mehr umleiten, wird sie nicht angehalten - und hier leiten Sie zur Konsole um. Sie können auf ähnliche Weise zu einer anderen Datei wie dieser umleiten, ohne die Pausen von mehr, wenn dies Ihr gewünschtes Endergebnis ist. Verwenden Sie>, um zur Datei umzuleiten und diese zu überschreiben, falls sie bereits vorhanden ist, oder >>, um sie an eine vorhandene Datei anzuhängen. (Kann entweder zum Umleiten zu con verwenden.)

Anon
quelle
5

Get-content -Tail n file.txtmit Powershell ist das einzige, was tailin Linux nahe kommt .

Das Get-Content *filename* | Select-Object -last *n*oben vorgeschlagene lädt / analysiert das Ganze. Unnötig zu erwähnen, dass es mit meiner 10-GB-Protokolldatei nicht zufrieden war ... Die -TailOption beginnt am Ende der Datei.

Sebas
quelle
2

Wenn Sie den Befehl head möchten, können Sie ihn auf einfache Weise installieren, indem Sie Cygwin installieren. Dann stehen Ihnen alle UNIX-Tools zur Verfügung.

Wenn dies keine gute Lösung ist, können Sie versuchen, findstr zu verwenden und nach dem Zeilenende-Indikator zu suchen.

findstr auf MSDN: http://technet.microsoft.com/en-us/library/bb490907.aspx

Zian Choy
quelle
2

Hier ist ein schneller nativer Kopfbefehl, mit dem Sie die ersten 9 Zeilen unter DOS erhalten.

findstr /n "." myfile.txt | findstr "^.:"

Die ersten 2 Zeichen in jeder Zeile sind die Zeilennummern.

Don4x
quelle
2

Versuchen Sie in PS, den folgenden Befehl zu verwenden:

Select -Last 1

Dieser Befehl kann auch per Pipeline weitergeleitet werden.

Beispiel für die erste Zeile:

type .\out.txt | Select -Last 1

oder um die erste Zeile zu erhalten:

 type .\out.txt | Select -First 1
Gico
quelle
1

FWIW, für diejenigen, die nur eine unbestimmte Anzahl von Datensätzen vom Kopf der Datei abschneiden müssen, funktioniert more> gut. Dies ist nur nützlich, um eine kleinere Datei zu haben, mit der Sie in den frühen Stadien der Entwicklung von etwas arbeiten können.

user382459
quelle
1

Ich habe nicht versucht, einen Bereich zu extrahieren, konnte jedoch mit dem folgenden DOS-Befehl eine Zeile abrufen:

find /N " " *.log|find "[6]" 

Da die meisten Dateien Leerzeichen enthalten, zieht dieser Befehl jede Zeile aus allen LOG-Dateien und nummeriert sie grundsätzlich ab 1 für jede Datei. Die nummerierten Ergebnisse werden dann in den zweiten FINDBefehl weitergeleitet, der nach der als Nummer 6 gekennzeichneten Zeile sucht.

sergioPinheiro
quelle
1

Auf dieser Seite gibt es ein kostenloses headDienstprogramm , das Sie verwenden können. Ich habe es noch nicht versucht.

JeffH
quelle
1
Ich bin mir nicht sicher, warum dies abgelehnt wurde. Es wird genau wie das UNIX-Kopfdienstprogramm ausgeführt.
Coson
1
Es ist ein Download-Link. Soll er die Binärdatei uuencodieren und in die Antwort einbetten?
GargantuChet
0
set /p line= < file.csv 
echo %line%

Die erste Zeile Ihrer Datei in cmd Windows wird in der Variablen% line% zurückgegeben.

Sergey Orlov
quelle
0

Als zeitgemäße Antwort können Sie unter Windows 10 das "Linux-Subsystem für Windows" verwenden.

https://docs.microsoft.com/en-us/windows/wsl/install-win10

Auf diese Weise können Sie native Linux-Befehle in Windows ausführen und so tail genau so ausführen, wie Sie es unter Linux tun würden.

Alex KeySmith
quelle
-2

Ich glaube nicht, dass es einen Ausweg gibt. Es gibt keinen solchen Befehl in DOS und Batch-Dateien sind viel zu beschränkt, um ihn zu simulieren (ohne größere Schmerzen).

EricSchaefer
quelle
-2

Warnung: Die Verwendung der Batchdatei für, Token und Delims bei unbekannter Texteingabe kann aufgrund der speziellen Interpretation von Zeichen wie &,!, <Usw. eine Katastrophe sein. Solche Methoden sollten nur für vorhersehbaren Text reserviert werden.

Chargenwarnung
quelle