Equivalent Windows de la commande 'tail'


107

Existe-t-il un moyen de simuler la commande * nix tail sur la ligne de commande Windows? J'ai un fichier et je veux un moyen de couper les n premières lignes de texte. Par exemple:

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

D:\>type result.txt
line two
line three

10
N'affiche pas headuniquement les n premières lignes au lieu de les omettre?
Joey

S'il vous plaît Chris considérez les nouvelles réponses depuis 2009, plus spécifiquement la réponse d'Amit Portnoy . Comme votre question est générale, de nombreux utilisateurs peuvent trouver cette page Web. Et ils peuvent arrêter de lire les réponses après la première: la réponse que vous avez acceptée. Vous pouvez changer la réponse que vous avez acceptée en une autre plus mise à jour des possibilités actuelles. Cheers;)
olibre

Je suis un peu confus. La question originale concernait la headcommande de style Unix , mais la sortie souhaitée semblait vouloir tail. Il semble que les réponses concernent headet non tail.
blakeoft

@blakeoft la question originale demandait le comportement de tail, mais le titre dithead
MM

Réponses:


89

Pas d'équivalent exact. Cependant, il existe une commande DOS native "more" qui a une option + n qui commencera à sortir le fichier après la nième ligne:

Invite DOS:

C:\>more +2 myfile.txt

La commande ci-dessus affichera tout après les 2 premières lignes.
C'est en fait l'inverse de la tête Unix :

Console Unix:

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

La commande ci-dessus n'imprimera que les 2 premières lignes du fichier.


8
Non, ce n'est pas pareil. tailcommence à compter à partir de la fin du fichier. Alors, tail -2imprimera les deux dernières lignes.
ADTC

5
Puis-je également imprimer les n premiers caractères?
Qwerty

@ADTC (ma version de) tail ne prend pas en charge les négatifs. seule la tête fait (gnuwin32)
nl-x

@ nl-x -2n'est pas un négatif. C'est juste une version abrégée de -n 2(nombre de lignes). Malheureusement, beaucoup trop d'implémentations de tailne prennent pas en charge -2, ce qui le rend très incompatible avec les headimplémentations qui l' accompagnent . Cela m'a ennuyé trop de fois.
ADTC

@ADTC Ah désolé. J'étais confus avec head -n -2lequel est différent de head -n 2. Mais avec la queue, ce dernier n'existe pas.
nl-x

111

SI vous avez installé Windows PowerShell (je pense qu'il est inclus depuis XP), vous pouvez simplement exécuter à partir de cmd.exe:

Commandement de la tête:

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

Commande de queue:

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

ou, directement à partir de PowerShell:

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


mettre à jour

PowerShell 3.0 (Windows 8 et supérieur) a ajouté une Tailcommande avec un alias Last. Headet des Firstalias TotalCountont également été ajoutés.

Ainsi, les commandes peuvent être réécrites comme

Get-Content *filename* -Head *n*
Get-Content *filename* -Tail *n*

Cela ne se comporte-t-il pas comme headau lieu de tail?
blakeoft

@blakeoft oui ... j'ai mis à jour ma réponse. C'est incroyable qu'il ait fallu 2 ans et 17 votes avant que quelqu'un commente cela.
Amit Portnoy

@blakeoft vient de réaliser que la question a été modifiée! (voir stackoverflow.com/posts/1295068/revisions). Il a initialement demandé la commande head ... mis à jour pour inclure les deux réponses ...
Amit Portnoy

2
@AmitPortnoy J'ai trouvé une autre réponse quelque part sur cet échange de pile en disant qu'il y Get-Contenta maintenant une commande tail. Par exemple, Get-content -Tail 5 file.txtimprimera les cinq dernières lignes de file.txt. Merci d'avoir mis à jour votre réponse btw.
blakeoft

2
un moyen de l'utiliser comme filtre? (par exemple lire stdin au lieu d'un fichier)
eadmaster

24
more /e filename.txt P n

où n = le nombre de lignes à afficher. Fonctionne rapidement et est exactement comme la headcommande.


14
Les commandes telles que P, S, etc. ne peuvent être saisies que par l'utilisateur à l'invite. Ils ne peuvent pas être transmis à la commande more. Ainsi, l'exemple ci-dessus ne fonctionne pas
Philibert Perusse


12

C'est un hack total, mais s'il s'agit d'un fichier énorme dont vous souhaitez simplement examiner le format, l'en-tête, etc. et que vous recherchez une solution, vous pouvez toujours simplement rediriger la sortie `` plus '' vers un nouveau fichier et CTRL-C rapidement. Les lignes de sortie ne peuvent pas être contrôlées avec précision et vous la tuerez probablement au milieu d'une ligne de sortie, mais c'est un moyen peu coûteux de récupérer un petit morceau d'un fichier autrement inutilisable.

Ex.

C: \ plus test.csv> test.txt 
^ C C: \ more test.txt
ligne 1
ligne 2
etc ...... C: \

9

Eh bien, cela va le faire , mais il est à peu près aussi vite qu'il semble (environ O (n * m), où n est le nombre de lignes à afficher et m est le nombre total de lignes dans le fichier):

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

Où "10" est le nombre de lignes à imprimer et "filename" est le nom du fichier.


6
+1 pour une solution qui vous a pris plus de temps à taper que le téléchargement d'un port de head.
Camilo Martin

1
Remarque: mettez cette expression entre crochets - (expr) > out.txt- lors de l'envoi des résultats dans un fichier, sinon vous n'obtiendrez que la dernière ligne. Ou ajoutez - expr >> out.txt.
cz le

9

Powershell:

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

Get-Content C:\logs\result.txt -wait (monitor the tail)

C'est la bonne réponse, à jour et pertinente (contrairement à cmd). Merci.
cudacoder

7

Lorsque vous utilisez more + n que Matt a déjà mentionné, pour éviter les pauses dans les fichiers longs, essayez ceci:

plus +1 myfile.txt> con

Lorsque vous redirigez la sortie de more, elle ne s'arrête pas - et ici vous redirigez vers la console. Vous pouvez également rediriger vers un autre fichier comme celui-ci sans les pauses de plus si c'est le résultat final souhaité. Utilisez> pour rediriger vers un fichier et l'écraser s'il existe déjà, ou >> pour l'ajouter à un fichier existant. (Peut utiliser l'un ou l'autre pour rediriger vers con.)



5

Get-content -Tail n file.txtavec PowerShell est la seule chose qui se rapproche de tailLinux.

Le Get-Content *filename* | Select-Object -last *n*suggéré ci-dessus charge / analyse le tout. Inutile de dire qu'il n'était pas satisfait de mon fichier journal de 10 Go ... L' -Tailoption commence à la fin du fichier.


2

Si vous voulez la commande head, un moyen simple de l'obtenir est d'installer Cygwin. Ensuite, vous aurez tous les outils UNIX à votre disposition.

Si ce n'est pas une bonne solution, vous pouvez essayer d'utiliser findstr et faire une recherche pour l'indicateur de fin de ligne.

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


2

Voici une commande head native rapide qui vous donne les 9 premières lignes sous DOS.

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

Les 2 premiers caractères de chaque ligne seront le numéro de ligne.



2

dans PS, essayez d'utiliser la commande:

Select -Last 1

Cette commande peut également être mise en pipeline.

Exemple pour obtenir la première ligne:

type .\out.txt | Select -Last 1

ou pour obtenir la première ligne:

 type .\out.txt | Select -First 1

1

FWIW, pour ceux qui ont juste besoin de couper un nombre indéterminé d'enregistrements de la tête du fichier, more> fonctionne bien. Ceci est utile simplement pour avoir un fichier plus petit avec lequel travailler dans les premières étapes du développement de quelque chose.


1

Je n'ai pas essayé d'extraire une plage, mais j'ai pu obtenir une ligne en utilisant la commande DOS suivante:

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

Puisque la plupart des fichiers contiennent des espaces, cette commande extrait chaque ligne de tous les fichiers LOG et les numérote essentiellement à partir de 1 pour chaque fichier. Les résultats numérotés sont ensuite envoyés dans la deuxième FINDcommande qui recherche la ligne étiquetée comme numéro 6.


1

Il y a un headutilitaire gratuit sur cette page que vous pouvez utiliser. Je n'ai pas encore essayé.


1
Je ne sais pas pourquoi cela a été rejeté. Il s'exécute exactement comme l'utilitaire principal UNIX.
coson

1
C'est un lien de téléchargement. Est-il censé uuencoder le binaire et l'intégrer dans la réponse?
GargantuChet

0
set /p line= < file.csv 
echo %line%

il retournera la première ligne de votre fichier dans cmd Windows dans la variable% line%.



-2

Je ne pense pas qu'il y ait moyen de sortir de la boîte. Il n'y a pas de telle commande dans DOS et les fichiers batch sont loin d'être limités pour le simuler (sans douleur majeure).


-2

Attention, l'utilisation du fichier de commandes pour, les jetons et la capacité de délimitation sur une entrée de texte inconnue peut être un désastre en raison de l'interprétation spéciale de caractères comme &,!, <, Etc. De telles méthodes devraient être réservées uniquement au texte prévisible.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.