2012-03-13 7 views
57

Windowsでログファイルを確認するにはこれらのコマンドが必要ですが、私はプログラムをインストールしません.WindowsのPowershellが好きです。Powershellで何を頭、尾、より多く、少なく、sedするか?

+0

ログファイルが大きすぎます。約数MBです。 notepad.exeで表示するのは難しいです。 –

+0

'notepad'をベースにしているのであれば、代替テキストエディタを見ることをお勧めします。(無料と有料の両方の)代替案がたくさんあります。すべてはメモ帳よりも優れています(それでも大したことではありません)。 – Richard

+0

[PowerShell vs. Unix Shells](http://stackoverflow.com/questions/573623/powershell-vs-unix-shells)の可能な複製 – manojlds

答えて

90

Get-Content(エイリアス:gc)は、通常、テキストファイルを読むためのオプションです。

gc log.txt | select -first 10 # head 
gc -TotalCount 10 log.txt  # also head 
gc log.txt | select -last 10 # tail 
gc -Tail 10 log.txt   # also tail (since PSv3), also much faster than above option 
gc log.txt | more    # or less if you have it installed 
gc log.txt | %{ $_ -replace '\d+', '($0)' }   # sed 

これは、小さなファイルの場合は十分に機能し、大きいファイルの場合(数MB以上)は多少遅くなる可能性があります。

PowerShell Community Extensionsには、特殊なファイル用のコマンドレット(Get-FileTailなど)が含まれています。

+0

ありがとう、私のための大きな助け。 –

+1

聖なる牛。これは、1GBのCSVで '-last 2'をするために私のCPUを使い果たしている。熱い飲み物:☕ – mlissner

+6

@mlissner:PowerShell v3をお使いの場合は、代わりに 'Get-Content -Tail 2'を使うことができます。それは間違いなく高速です。 – Joey

6

more.exeがWindowsに存在する場合、lessのポートが簡単に見つかります(PowerShell Community Extensions、PSCX、1つを含む)。

PowerShellでは、どちらのプログラムでも別の方法はありませんが、構造化データの場合はOut-Gridが役に立ちます。

HeadTail両方それぞれ-First-Lastパラメータを使用してSelect-Objectでエミュレートすることができます。

Sed機能はすべて利用可能ですが、構造が異なります。フィルタリングオプションは、Where-Object(またはForeach-Objectと範囲のある状態を介して)で利用できます。他の変換、操作はSelect-ObjectForeach-Objectで行うことができます。

しかし、PowerShellが(.NET)オブジェクトを渡すとき、すべての型付けされた構造体、日付はDateTimeのままです - 各コマンドがそれ自身を解析する必要がある文字列ではなく、sedとそのようなプログラムの多くは冗長です。

1

Windowsで大きな(または小さい)ログファイルをクエリする必要がある場合は、私が見つけた最も良いツールはMicrosoftの無料Log Parser 2.2です。あなたが望むならPowerShellから呼び出すことができます。そして、それはあなたのためにすべての重労働を、そして非常に速くも行います。

+0

ありがとうと、私の環境は、Log Parser2.2のシステム要件ではないWin2k8R2です –

0

私はいくつかのより良い解決策ました:

gc log.txt -ReadCount 5 | %{$_;throw "pipeline end!"} # head 
gc log.txt | %{$num=0;}{$num++;"$num $_"}    # cat -n 
gc log.txt | %{$num=0;}{$num++; if($num -gt 2 -and $num -lt 7){"$num $_"}} # sed 
15

ここではheadtailを行うには、組み込みの方法です。大きなファイルを持っている場合は非常に遅いので、パイプは使用しないでください。これらのビルトインオプションを使用すると、巨大なファイルであっても非常に高速になります。

gc log.txt -head 10 
gc log.txt -tail 10 
gc log.txt -tail 10 -wait # equivalent to tail -f 
+0

[Joeyのコメント](https://stackoverflow.com/questions/9682024/how-to-do-what-head-tail- less-sed-in-powershell#comment60271566_9682594)は正反対のようです!誰が信頼するのか、どの(組み込みの)方法が最も効率的かをどのように知っていますか? –

+1

@NH私の答えはJoeyのコメントと一致しています。彼のコメントは、「最後は遅いです...だからGet-Content -Tailが存在する理由です」 '| select -last'はパイプを使用します。私は '-tail'をパイプなしで使用しています。しかし、2つの矛盾する答えが見つかった場合は、おそらく評判の高い人物を信頼することができます。また、大きなファイルで2つの方法を試すこともできます。大きなファイルでは非常に明白です。 – wisbucky

+0

入手しました。申し訳ありませんが、私は最初に私が記事を読むと混乱しているに違いない。 –

関連する問題