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
Chris Smith
la source
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
Copie possible de la recherche d'un équivalent Windows de la commande unix tail
Álvaro González

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.

Matthieu Nizol
la source
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*
Amit Portnoy
la source
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.

Dan
la source
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
17

Vous pouvez obtenir CoreUtils de GnuWin32 , qui est une collection d'outils Unix standard, portés sur Windows.

Il contient, entre autres, de la tête.

Sebastian Paaske Tørholm
la source
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: \
user2041301
la source
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.

Brianary
la source
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)
Manuel Alves
la source
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.)

Anon
la source
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.

Sebas
la source
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

Zian Choy
la source
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.

Don4x
la source
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
Gico
la source
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.

user382459
la source
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.

sergioPinheiro
la source
1

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

JeffH
la source
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%.

Sergey Orlov
la source
0

Comme réponse contemporaine, si vous exécutez Windows 10, vous pouvez utiliser le «sous-système Linux pour Windows».

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

Cela vous permettra d'exécuter des commandes linux natives à partir de Windows et ainsi d'exécuter tail exactement comme vous le feriez sous Linux.

Alex KeySmith
la source
-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).

EricSchaefer
la source
-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.

Avertissement de lot
la source