「tail」コマンドに相当するWindows


107

Windowsコマンドラインで* nix tailコマンドをシミュレートする方法はありますか?ファイルがあり、最初のn行のテキストを切り取る方法が必要です。例えば:

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
省略せずにhead最初のn行だけを表示しませんか?
ジョーイ

クリスは2009年以降の新しい回答、具体的にはアミット・ポートノイの回答を検討してください。一般的な質問なので、多くのユーザーがこのWebページを見つける可能性があります。そして、彼らは最初の答えの後、あなたが受け入れた答えを読むのをやめるかもしれません。受け入れた回答を、現在の可能性に合わせて更新された別の回答に変更できます。乾杯;)
olibre 2013

私は少し混乱しています。元の質問は、Unixスタイルのheadコマンドに関するものでしたが、必要な出力は望んだように見えましたtail。答えはそうでheadあり、そうではないようtailです。
blakeoft 2015年

@blakeoft元の質問ではの動作を求めていましたtailが、タイトルには次のように記載されていましたhead
MM

回答:


89

正確な同等物はありません。ただし、n行目以降にファイルの出力を開始する+ nオプションを持つネイティブDOSコマンド「more」が存在します。

DOSプロンプト:

C:\>more +2 myfile.txt

上記のコマンドは、最初の2行以降をすべて出力します。
これは実際にはUnixのの逆です:

Unixコンソール:

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

上記のコマンドは、ファイルの最初の2行のみを出力します。


8
いいえ、同じではありません。tailファイルの終わりからカウントを開始します。したがって、tail -2最後の2行を印刷します。
ADTC 2013年

5
最初のn文字も印刷できますか?
Qwerty、

@ADTC(私のバージョン)のテールはネガをサポートしていません。ヘッドのみ(gnuwin32)
nl-x

@ nl-x -2は負ではありません。-n 2(行数)の省略形です。残念ながら、のtailサポートが多すぎる実装はサポートせず、サポート-2する付随するhead実装と非常に矛盾しています。それは私を何度も悩ませてきました。
ADTC、2016年

@ADTCああごめんなさい。とhead -n -2は違うのかと戸惑いましたhead -n 2。しかし、テールには後者は存在しません。
nl-x

111

IFあなたが持っているWindows PowerShellをインストールしたばかりのCMD.EXEから実行することができます(私はそれがXP以降含まれていると思い):

ヘッドコマンド:

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

テールコマンド:

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

または、PowerShellから直接:

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


更新

PowerShell 3.0(Windows 8以降)にTail、エイリアス付きのコマンドが追加されましたLastHeadFirstエイリアスTotalCountも追加されました。

したがって、コマンドは次のように書き直すことができます

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

この振る舞いは好きではないhead代わりにtail
blakeoft 2015年

@blakeoftはい、そうです...私は私の答えを更新しました。誰かがこれについてコメントするまでに2年と17票を投じたことは驚くべきことです。
Amit Portnoy

@blakeoftは質問が編集されたことに気づきました!(stackoverflow.com/posts/1295068/revisionsを参照)。最初はヘッドコマンドを要求しました...両方の回答を含むように更新されました...
Amit Portnoy

2
@AmitPortnoyこのスタック交換のどこかにGet-Content、Tailコマンドがあるという別の答えが見つかりました。たとえばGet-content -Tail 5 file.txt、file.txtの最後の5行を印刷します。回答を更新していただきありがとうございます。
blakeoft

2
フィルターとして使用する方法はありますか?(例:ファイルの代わりにstdinを読み取る)
eadmaster

24
more /e filename.txt P n

ここで、n =表示する行数。高速に動作し、headコマンドとまったく同じです。


14
P、Sなどのコマンドは、ユーザーがプロンプトでのみ入力できます。これらをmoreコマンドに渡すことはできません。したがって、上記の例は機能しません
Philibert Perusse、


12

これは完全なハックですが、フォーマットやヘッダーなどを調べたい巨大なファイルであり、解決策を探している場合は、常に「more」出力を新しいファイルとCTRL-Cにリダイレクトするだけです。早く。出力行を正確に制御することはできないため、出力行の途中で強制終了する可能性が高くなりますが、それ以外の場合は使用できないファイルの小さなビットを取得する安価な方法です。


C:\ more test.csv> test.txt 
^ C C:\ more test.txt
1
行2行
など...... C:\

9

まあ、これはなりません、それを、それは(ファイルの総行数をn行数が表示やメートルにあるおよそO(N * m)を、)それは見た目ほど速いとのことです。

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

ここで、「10」は印刷する行数、「filename」はファイルの名前です。


6
のポートをダウンロードするよりも入力に時間がかかるソリューションの場合は+1 head
Camilo Martin

1
注:この式を角かっこで囲んでください- (expr) > out.txt結果をファイルに送信する場合、最後の行しか取得できません。または追加- expr >> out.txt
CZ

9

パワーシェル:

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

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

これは正解です。最新で関連性があります(cmdとは異なります)。ありがとう。
cudacoder 2017

7

Mattがすでに述べた+ nをさらに使用する場合は、長いファイルでの一時停止を回避するために、次のことを試してください。

もっと+1 myfile.txt> con

moreからの出力をリダイレクトしても、一時停止することはありません。ここでは、コンソールにリダイレクトします。同様に、このような他のファイルにリダイレクトできますが、それが目的の最終結果である場合は、さらに一時停止する必要はありません。>を使用してファイルにリダイレクトし、ファイルが既に存在する場合は上書きするか、または>>を使用して既存のファイルに追加します。(いずれかに使用してconにリダイレクトできます。)



5

Get-content -Tail n file.txtLinuxでは、Powershellを使用するのが唯一の方法ですtail

上記のGet-Content *filename* | Select-Object -last *n*提案は全体をロード/解析します。言うまでもなく、10 GBのログファイルには満足できませんでした... -Tailオプションはファイルの終わりまでに始まります。


2

headコマンドが必要な場合、Cygwinをインストールするのが簡単な方法の1つです。そうすれば、すべてのUNIXツールを自由に使えるようになります。

それが良い解決策でない場合は、findstrを使用して、行末インジケーターを検索してみてください。

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


2

以下は、DOSで最初の9行を表示する高速のネイティブヘッドコマンドです。

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

各行の最初の2文字が行番号になります。



2

PSでコマンドを使用してみてください:

Select -Last 1

このコマンドはパイプライン化することもできます。

最初の行を取得する例:

type .\out.txt | Select -Last 1

または最初の行を取得するには:

 type .\out.txt | Select -First 1

1

FWIW、ファイルの先頭から不確定な数のレコードを切り取るだけの場合は、more>が適切に機能します。これは、何かを開発する初期の段階で作業するために、より小さなファイルを用意するだけで役立ちます。


1

範囲の抽出は試みていませんが、次のDOSコマンドを使用して行を取得できました。

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

ほとんどのファイルにはスペースが含まれているため、このコマンドはすべてのLOGファイルからすべての行を取得し、基本的に各ファイルの1から始まる番号を付けます。番号付きの結果は、2番目のFINDコマンドにパイプされ、番号6のタグが付けられた行が検索されます。


1

このページには、使用できる無料のheadユーティリティがあります。まだ試していません。


1
これが反対投票された理由がわかりません。UNIXヘッドユーティリティとまったく同じように実行されます。
coson 2012

1
ダウンロードリンクです。彼はバイナリをuuencodeして答えに埋め込むことになっていますか?
GargantuChet 2017年



-2

私は、箱から出してすぐに道があるとは思いません。DOSにはそのようなコマンドはなく、バッチファイルはそれをシミュレートするために制限されています(大きな痛みなし)。


-2

警告、不明なテキスト入力にバッチファイルfor、トークン、およびdelims機能を使用すると、&、!、<などの文字の特別な解釈が原因で障害になる可能性があります。このようなメソッドは、予測可能なテキストのみに予約する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.