Windows equivalent of the 'tail' command [duplicate]
Asked Answered
O

21

132

Is there a way to simulate the *nix tail command on the Windows command line? I have a file and I want a way to snip off the first n lines of text. For example:

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

D:\>type result.txt
line two
line three
Ornstead answered 18/8, 2009 at 16:38 Comment(5)
Doesn't head show only the first n lines instead of leaving them out?Potman
Please Chris consider the new answers since 2009, more specifically the Amit Portnoy's answer. As your question is general, many user may find this web page. And they may stop reading the answers after the first one: the answer you have accepted. You can change the answer you have accepted to another more updated to nowadays possibilities. Cheers ;)Boonie
I'm a tad confused. The original question was about the Unix style head command, but the desired output looked like it was wanting tail. It looks like the answers are about head and not tail.Rosamariarosamond
@Rosamariarosamond the original question was asking for the behaviour of tail, however the title said headRenee
It is not clear in the example if the intended command is *[call to tail]* 2 > result.txt, in which case it is equivalent to tail, or *[call to tail]* 1 > result.txt, in which case it is not.Wehrle
I
105

No exact equivalent. However there exist a native DOS command "more" that has a +n option that will start outputting the file after the nth line:

DOS Prompt:

C:\>more +2 myfile.txt

The above command will output everything after the first 2 lines.
This is actually the inverse of Unix head:

Unix console:

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

The above command will print only the first 2 lines of the file.

Insecticide answered 18/8, 2009 at 16:48 Comment(7)
No, it's not the same. tail starts counting from the end of file. So, tail -2 will print the last two lines.Foofaraw
Can I print first n characters too?Italianism
@Foofaraw (my version of) tail doesnt support negatives. only head does (gnuwin32)Rorqual
@Rorqual -2 is not a negative. It's just a shorthand version of -n 2 (number of lines). Unfortunately, far too many implementations of tail do not support -2, making it very inconsistent with accompanying head implementations which do. It has annoyed me one too many times.Foofaraw
@Foofaraw Ah sorry. I was confused with head -n -2 which is different from head -n 2. But with tail, the latter doesn't exist.Rorqual
Be careful if using this with redirection as implied in the question. Redirected output pauses after 65535 lines.Desirae
@Foofaraw most versions of tail also support a "how many lines from the top" behavior by prefixing the number with +. So regarding the example above, to get everything after the second line (e.g. the third line and below), use tail -n +3Eusebiaeusebio
L
140

IF you have Windows PowerShell installed (I think it's included since XP) you can just run from cmd.exe:

Head Command:

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

Tail Command:

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

or, directly from PowerShell:

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


update

PowerShell 3.0 (Windows 8 and higher) added Tail command with alias Last. Head and First aliases to TotalCount were also added.

So, commands can be re-written as

Get-Content *filename* -Head *n*
Get-Content *filename* -Tail *n*
Lepidus answered 15/1, 2013 at 16:0 Comment(7)
Doesn't this behave like head instead of tail?Rosamariarosamond
@Rosamariarosamond yes it did... I've updated my answer. It's amazing that it took 2 year and 17 votes up before someone commented on this.Lepidus
@Rosamariarosamond just realized that the question was edited! (see stackoverflow.com/posts/1295068/revisions). It originally asked for the head command... updated to include both answers...Lepidus
@AmitPortnoy I found another answer somewhere on this stack exchange saying that Get-Content has a tail command now. For example, Get-content -Tail 5 file.txt will print the last five lines of file.txt. Thanks for updating your answer btw.Rosamariarosamond
any way to use it as a filter? (eg. reading stdin instead of file)Longford
actually it's included since VistaDemars
PowerShell cannot be run in any DOS system I know.Indistinguishable
I
105

No exact equivalent. However there exist a native DOS command "more" that has a +n option that will start outputting the file after the nth line:

DOS Prompt:

C:\>more +2 myfile.txt

The above command will output everything after the first 2 lines.
This is actually the inverse of Unix head:

Unix console:

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

The above command will print only the first 2 lines of the file.

Insecticide answered 18/8, 2009 at 16:48 Comment(7)
No, it's not the same. tail starts counting from the end of file. So, tail -2 will print the last two lines.Foofaraw
Can I print first n characters too?Italianism
@Foofaraw (my version of) tail doesnt support negatives. only head does (gnuwin32)Rorqual
@Rorqual -2 is not a negative. It's just a shorthand version of -n 2 (number of lines). Unfortunately, far too many implementations of tail do not support -2, making it very inconsistent with accompanying head implementations which do. It has annoyed me one too many times.Foofaraw
@Foofaraw Ah sorry. I was confused with head -n -2 which is different from head -n 2. But with tail, the latter doesn't exist.Rorqual
Be careful if using this with redirection as implied in the question. Redirected output pauses after 65535 lines.Desirae
@Foofaraw most versions of tail also support a "how many lines from the top" behavior by prefixing the number with +. So regarding the example above, to get everything after the second line (e.g. the third line and below), use tail -n +3Eusebiaeusebio
H
27

Powershell:

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

Get-Content C:\logs\result.txt -wait (monitor the tail)
Hemorrhoid answered 6/6, 2017 at 15:37 Comment(2)
This is the correct answer, up to date and relevant (unlike cmd). Thanks.Gunpoint
You can also combine them: Get-Content c:\Logs\Results.txt -Tail 10 -wait This will show the last 10 lines and wait for new entries.Keto
A
24
more /e filename.txt P n

where n = the number of rows to display. Works fast and is exactly like head command.

Aronson answered 17/6, 2011 at 15:39 Comment(1)
Commands such as P, S, etc. can only be input by the user at the prompt. They cannot be passed-in to the more command. Thus, the example above does not workCouscous
E
18

You could get CoreUtils from GnuWin32, which is a collection of standard unix tools, ported to Windows.

It, among other things, contains head.

Earl answered 18/8, 2009 at 16:42 Comment(0)
E
13

This is a total hack but if it's a huge file that you want to just examine the format, header, etc. and you're looking for a solution you can always just redirect the 'more' output to a new file and CTRL-C quickly. The output rows can't be controlled precisely and you will most likely kill it in the middle of a line of output but it's a cheap way of grabbing a small bit of an otherwise unusable file.

Ex.

C:\more test.csv > test.txt 
^C C:\more test.txt
line 1
line 2
etc...... C:\
Erine answered 4/2, 2013 at 23:1 Comment(0)
P
9

Well, this will do it, but it's about as fast as it looks (roughly O(n*m), where n is the number of lines to display and m is the total number of lines in the file):

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

Where "10" is the number of lines you want to print, and "filename" is the name of the file.

Peppel answered 19/8, 2009 at 18:51 Comment(2)
+1 for a solution that took you longer to type than downloading a port of head.Pungy
Note: Put this expression in brackets - (expr) > out.txt - when sending the results to a file, or you'll only get the last line. Or append - expr >> out.txt.Salol
S
8

When using more +n that Matt already mentioned, to avoid pauses in long files, try this:

more +1 myfile.txt > con

When you redirect the output from more, it doesn't pause - and here you redirect to the console. You can similarly redirect to some other file like this w/o the pauses of more if that's your desired end result. Use > to redirect to file and overwrite it if it already exists, or >> to append to an existing file. (Can use either to redirect to con.)

Scenography answered 18/8, 2009 at 17:2 Comment(0)
H
6

you can also use Git bash where head and tail are emulated as well

Hyperphagia answered 9/4, 2015 at 15:12 Comment(1)
Also the official Bash on Windows msdn.microsoft.com/en-us/commandline/wsl/…Titrate
B
5

Get-content -Tail n file.txt with powershell is the only thing that comes close to tail in linux.

The Get-Content *filename* | Select-Object -last *n* suggested above loads/parse the whole thing. Needless to say, it was not happy with my 10GB log file... The -Tail option does start by the end of the file.

Balsamiferous answered 12/2, 2016 at 17:39 Comment(1)
I'm not sure if it does start by the end but -Tail took several minutes for a -Tail 100 until I cancelled it. The file was slightly below 800MBKnowledgeable
A
4

in PS try to use command:

Select -Last 1

This command can be pipelined also.

Example to get first line:

type .\out.txt | Select -Last 1

or to get the first line:

 type .\out.txt | Select -First 1
Anticholinergic answered 15/5, 2019 at 9:9 Comment(0)
G
2

If you want the head command, one easy way to get it is to install Cygwin. Then you'll have all the UNIX tools at your disposal.

If that isn't a good solution, then you can try using findstr and do a search for the end-of-line indicator.

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

Gargoyle answered 18/8, 2009 at 16:41 Comment(0)
E
2

Here is a fast native head command that gives you the first 9 lines in DOS.

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

The first 2 characters on each line will be the line number.

Extraneous answered 17/10, 2013 at 22:30 Comment(0)
C
2

There is a resource kit that can be downloaded from here: http://www.microsoft.com/downloads/en/confirmation.aspx?familyId=9d467a69-57ff-4ae7-96ee-b18c4790cffd&displayLang=en

It contains a tail.exe tool but it is only compatible with some Windows versions

(Copied from this post: Tail command for windows)

Chimerical answered 4/5, 2015 at 13:19 Comment(0)
E
1

I have not tried extracting a range, but I was able to get a line using the following DOS command:

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

Since most files contain spaces, this command pulls every line from all LOG files and basically numbers them starting from 1 for each file. The numbered results are then piped into the second FIND command which looks for the line tagged as number 6.

Enumerate answered 9/12, 2010 at 1:28 Comment(0)
M
1

FWIW, for those just needing to snip off an indeterminate number of records from the head of the file, more > works well. This is useful just to have a smaller file to work with in the early stages of developing something.

Marley answered 26/4, 2011 at 18:5 Comment(0)
C
0

There's a free head utility on this page that you can use. I haven't tried it yet.

Cal answered 18/8, 2009 at 16:45 Comment(1)
This executes exactly like the UNIX head utility.Batsman
C
0
set /p line= < file.csv 
echo %line%

it will return first line of your file in cmd Windows in variable %line%.

Curtcurtail answered 19/4, 2017 at 20:40 Comment(0)
P
0

As a contemporary answer, if running Windows 10 you can use the "Linux Subsystem for Windows".

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

This will allow you to run native linux commands from within windows and thus run tail exactly how you would in linux.

Prune answered 7/2, 2019 at 10:32 Comment(0)
S
0

To keep the 1st few lines of text (head):

set n=<lines>
for /l %a in (1,1,%n%) do (
for /f "tokens=*" %i in ('find /v /n "" ^< test1.txt ^| find "[%a]"') do (
REM ove prefixed line numbers:
set a=%i
set a=!a:*]=! 
echo:!a!)
)

To discard the 1st few lines of text (tail):

set n=<lines>
set file=<file.txt>
set /a n=n+1 >nul
for /f "tokens=*" %i in ('find /v /c "" ^< %file%') do set total=%i
for /l %a in (%n%,1,%total%) do (
for /f "tokens=*" %i in ('find /v /n "" ^< %file% ^| find "[%a]"') do (
REM ove prefixed line numbers:
set a=%i
set a=!a:*]=! 
echo:!a!)
)

Note:
The head function can also be achieved by fsutil
The tail function can also be achieved by fc & comp

Tested on Win 10 cmd

Sinistrorse answered 26/3, 2021 at 15:43 Comment(0)
U
-3

Warning, using the batch file for, tokens, and delims capability on unknown text input can be a disaster due to the special interpretation of chars like &, !, <, etc. Such methods should be reserved for only predictable text.

Unmoved answered 13/11, 2010 at 20:23 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.