Equivalente do Windows do comando 'tail'

107

Existe uma maneira de simular o comando * nix tail na linha de comando do Windows? Eu tenho um arquivo e quero uma maneira de cortar as primeiras n linhas de texto. Por exemplo:

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
fonte
10
Não headmostra apenas as primeiras n linhas em vez de deixá-las de fora?
Joey
Por favor, Chris considere as novas respostas desde 2009, mais especificamente a resposta de Amit Portnoy . Como sua pergunta é geral, muitos usuários podem encontrar esta página da web. E eles podem parar de ler as respostas após a primeira: a resposta que você aceitou. Você pode mudar a resposta que você aceitou para outra mais atualizada com as possibilidades atuais. Saúde;)
olibre
Estou um pouco confuso. A pergunta original era sobre o headcomando estilo Unix , mas a saída desejada parecia estar faltando tail. Parece que as respostas são sobre heade não tail.
blakeoft
@blakeoft, a pergunta original era sobre o comportamento de tail, no entanto, o título diziahead
MM
Possível duplicata de Procurando por uma janela equivalente ao comando unix tail
Álvaro González

Respostas:

89

Nenhum equivalente exato. No entanto, existe um comando DOS nativo "more" que tem uma opção + n que iniciará a saída do arquivo após a enésima linha:

Prompt do DOS:

C:\>more +2 myfile.txt

O comando acima irá mostrar tudo após as primeiras 2 linhas.
Este é realmente o inverso da cabeça do Unix :

Console Unix:

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

O comando acima imprimirá apenas as 2 primeiras linhas do arquivo.

Matthew Nizol
fonte
8
Não, não é o mesmo. tailcomeça a contar a partir do final do arquivo. Portanto, tail -2imprimiremos as duas últimas linhas.
ADTC de
5
Posso imprimir os primeiros n caracteres também?
Qwerty de
@ADTC (minha versão de) cauda não suporta negativos. apenas a cabeça o faz (gnuwin32)
nl-x
@ nl-x -2não é negativo. É apenas uma versão abreviada de -n 2(número de linhas). Infelizmente, muitas implementações de tailnão suportam -2, tornando-o muito inconsistente com as headimplementações que o acompanham . Isso me irritou muitas vezes.
ADTC de
@ADTC Ah, desculpe. Fiquei confuso com o head -n -2que é diferente de head -n 2. Mas com cauda, ​​esta última não existe.
nl-x
111

SE você tiver o Windows PowerShell instalado (acho que está incluído desde o XP), você pode apenas executar a partir do cmd.exe:

Comando de cabeça:

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

Comando de cauda:

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

ou, diretamente do PowerShell:

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


atualizar

PowerShell 3.0 (Windows 8 e superior) adicionou Tailcomando com alias Last. Heade Firstaliases paraTotalCount também foram adicionados.

Portanto, os comandos podem ser reescritos como

Get-Content *filename* -Head *n*
Get-Content *filename* -Tail *n*
Amit Portnoy
fonte
Isso não se comporta como em headvez de tail?
blakeoft
@blakeoft sim, atualizei minha resposta. É incrível que demorou 2 anos e 17 votos para que alguém comentasse sobre isso.
Amit Portnoy
@blakeoft acaba de perceber que a questão foi editada! (consulte stackoverflow.com/posts/1295068/revisions). Originalmente pedia o comando head ... atualizado para incluir ambas as respostas ...
Amit Portnoy
2
@AmitPortnoy Eu encontrei outra resposta em algum lugar nesta troca de pilha dizendo que agora Get-Contenttem um comando tail. Por exemplo, Get-content -Tail 5 file.txtimprimirá as últimas cinco linhas de arquivo.txt. Obrigado por atualizar sua resposta btw.
blakeoft
2
alguma maneira de usá-lo como um filtro? (por exemplo, lendo stdin em vez de arquivo)
eadmaster
24
more /e filename.txt P n

onde n = o número de linhas a serem exibidas. Funciona rápido e é exatamente como o headcomando.

Dan
fonte
14
Comandos como P, S, etc. só podem ser inseridos pelo usuário no prompt. Eles não podem ser passados ​​para o comando more. Assim, o exemplo acima não funciona
Philibert Perusse
17

Você pode obter CoreUtils do GnuWin32 , que é uma coleção de ferramentas padrão do Unix, portadas para o Windows.

Ele, entre outras coisas, contém cabeça.

Sebastian Paaske Tørholm
fonte
12

Este é um hack total, mas se for um arquivo grande que você deseja apenas examinar o formato, cabeçalho, etc. e você está procurando uma solução, você pode sempre redirecionar a saída 'mais' para um novo arquivo e CTRL-C rapidamente. As linhas de saída não podem ser controladas com precisão e você provavelmente irá eliminá-lo no meio de uma linha de saída, mas é uma maneira barata de pegar um pequeno pedaço de um arquivo que de outra forma seria inutilizável.

Ex.

C: \ more test.csv> test.txt 
^ C C: \ more test.txt
linha 1
linha 2
etc ...... C: \
user2041301
fonte
9

Bem, isso vai funcionar , mas é quase tão rápido quanto parece (aproximadamente O (n * m), onde n é o número de linhas a serem exibidas em é o número total de linhas no arquivo):

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

Onde "10" é o número de linhas que você deseja imprimir e "nome do arquivo" é o nome do arquivo.

brianary
fonte
6
+1 para uma solução que demorou mais para digitar do que para baixar uma porta de head.
Camilo Martin,
1
Nota: Coloque esta expressão entre colchetes - (expr) > out.txt- ao enviar os resultados para um arquivo, ou você obterá apenas a última linha. Ou anexe - expr >> out.txt.
cz
9

Powershell:

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

Get-Content C:\logs\result.txt -wait (monitor the tail)
Manuel alves
fonte
Esta é a resposta correta, atualizada e relevante (ao contrário do cmd). Obrigado.
cudacoder de
7

Ao usar mais + n que Matt já mencionou, para evitar pausas em arquivos longos, tente o seguinte:

mais +1 myfile.txt> con

Quando você redireciona a saída de more, ele não pausa - e aqui você redireciona para o console. Você pode redirecionar da mesma forma para algum outro arquivo como este sem as pausas de mais se esse for o resultado final desejado. Use> para redirecionar para o arquivo e sobrescrevê-lo se ele já existir, ou >> para anexar a um arquivo existente. (Pode ser usado para redirecionar para con.)

Anon
fonte
5

Get-content -Tail n file.txtcom o PowerShell é a única coisa que chega perto tailno Linux.

O Get-Content *filename* | Select-Object -last *n*sugerido acima carrega / analisa tudo. Nem é preciso dizer que não fiquei satisfeito com meu arquivo de log de 10 GB ... A -Tailopção começa no final do arquivo.

Sebas
fonte
2

Se você deseja o comando head, uma maneira fácil de obtê-lo é instalar o Cygwin. Então você terá todas as ferramentas UNIX à sua disposição.

Se essa não for uma boa solução, você pode tentar usar findstr e fazer uma busca pelo indicador de fim de linha.

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

Zian Choy
fonte
2

Aqui está um comando head nativo rápido que fornece as primeiras 9 linhas no DOS.

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

Os primeiros 2 caracteres em cada linha serão o número da linha.

Don4x
fonte
2

no PS tente usar o comando:

Select -Last 1

Este comando também pode ser canalizado.

Exemplo para obter a primeira linha:

type .\out.txt | Select -Last 1

ou para obter a primeira linha:

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

FWIW, para aqueles que precisam apenas cortar um número indeterminado de registros do cabeçalho do arquivo, more> funciona bem. Isso é útil apenas para ter um arquivo menor para trabalhar nos estágios iniciais de desenvolvimento.

user382459
fonte
1

Não tentei extrair um intervalo, mas consegui obter uma linha usando o seguinte comando do DOS:

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

Como a maioria dos arquivos contém espaços, este comando puxa todas as linhas de todos os arquivos de LOG e basicamente os numera começando em 1 para cada arquivo. Os resultados numerados são então canalizados para o segundo FINDcomando que procura a linha marcada como o número 6.

sergioPinheiro
fonte
1

Há um headutilitário gratuito nesta página que você pode usar. Eu não tentei ainda.

JeffH
fonte
1
Não tenho certeza por que isso foi rejeitado. Ele é executado exatamente como o utilitário principal do UNIX.
coson de
1
É um link para download. Ele deve uuencodificar o binário e incorporá-lo na resposta?
GargantuChet
0
set /p line= < file.csv 
echo %line%

ele retornará a primeira linha do seu arquivo no cmd Windows na variável% line%.

Sergey Orlov
fonte
0

Como uma resposta contemporânea, se estiver executando o Windows 10, você pode usar o "Subsistema Linux para Windows".

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

Isso permitirá que você execute comandos nativos do Linux a partir do Windows e, portanto, execute o tail exatamente como faria no Linux.

Alex KeySmith
fonte
-2

Não acho que haja uma saída para a caixa. Esse comando não existe no DOS e os arquivos em lote são limitados para simulá-lo (sem maiores problemas).

EricSchaefer
fonte
-2

Aviso, usar o arquivo em lote para, tokens e capacidade de delims na entrada de texto desconhecido pode ser um desastre devido à interpretação especial de caracteres como &,!, <, Etc. Tais métodos devem ser reservados apenas para texto previsível.

Aviso de lote
fonte