Powershellで頭、尾、もっと、少なく、sedをどのように行うのですか?[閉まっている]


109

Windowsでは、PowerShellを使用して、何のlinuxのと同等のコマンドがありheadtailmorelesssed


ログファイルが大きすぎて、数メガバイト程度です。notepad.exeで表示するのは難しいです。
Yue Zhang

notepadベースとして使用している場合は、代替のテキストエディタを検討することをお勧めしますが、(無料と有料の両方の)代替案はたくさんあります。すべてはメモ帳より優れています(ただし、それほど難しいことではありません)。
Richard


私は大きなファイルを扱っており、Vimを使用/インストールしています。
sfanjoy

回答:


174

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

これは小さなファイルに対しては十分に機能し、大きなファイル(数MiB以上)はおそらく少し遅いです。

PowerShellのコミュニティの拡張機能は、特殊なファイルのもの(例えばは、Get-FileTail)のためのいくつかのコマンドレットが含まれています。


3
聖なる牛、これは-last 21GBのCSV を実行するために私のCPUを使い果たしています。ホットドリンク:☕
mlissner

9
@mlissner:PowerShell v3を使用している場合は、Get-Content -Tail 2代わりに使用できます。それは間違いなく速いです。
ジョーイ

gc log.txt | %{ $_ -replace '\d+', '($0)' } # sedコンテンツが戻されないため、実際には完全にsedツールではありません。Set-Contentが必要です。
Artyom

3
@Neil -Lastawk、同じタスクのために遅くなるのと同じ理由で遅いです:最初にストリームを完全に消費する必要があります。それがGet-Content -Tail存在する理由です。またhead、命名規則に適合しないためありませんSelect-Item。その目的はすでにによって提供されています。
ジョーイ

3
@neil @joeyにはのエイリアスがあり-headます。私の答えを見るstackoverflow.com/a/41626586/1081043
wisbucky 2017年

52

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

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

しかし、ジョーイのコメントは正反対を示しているようです!誰を信頼するか、またはどの(組み込み)メソッドが最も効率的かを知るにはどうすればよいですか?
NH。

2
@NH私の答えはジョーイのコメントに同意しています。彼のコメントは、「-Lastは遅いです...それがGet-Content -Tailが存在する理由です」と述べています。| select -lastパイプを使用します。-tailパイプなしで使用しています。しかし、2つの矛盾する答えを見つけた場合は、おそらくより高い評判の人を信頼することができます。また、大きなファイルに対して2つの方法を試すこともできます。大きなファイルでは非常に明白です。
wisbucky 2017

とった。申し訳ありませんが、投稿を初めて読んだときは混乱していました。
NH。

8

more.exeWindowsに存在し、のポートlessは簡単に見つかります(PowerShell Community Extensions、PSCXには1つ含まれています)。

PowerShellは実際にはどちらも個別のプログラムに代わる手段を提供していませんが、構造化データの場合Out-Gridは役立ちます。

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

Sed関数はすべて使用できますが、構造がかなり異なります。フィルタリングオプションはで利用できますWhere-Object(またはForeach-Object範囲の一部の状態を介して)。その他、変換、操作はSelect-Objectおよびを使用して実行できますForeach-Object

ただし、PowerShellが(.NET)オブジェクトを渡すと、型指定されたすべての構造が含まれます。日付はDateTimeインスタンスのままです。各コマンドがそれ自体を解析するために必要な文字列だけではなく、多くのsedプログラムやその他のプログラムは冗長です。


鮮やかさ。gcはパイプ入力をサポートしていないようです。コマンドの出力をフィルター処理する場合、 "... exe ... | select-object -first 20 | select-object -last 1"
A117

2

このインスタンスの「-TotalCount」は、「-head」とまったく同じように応答します。このようなコマンドを実行するには、-TotalCountまたは-headを使用する必要があります。しかし、-TotalCountは誤解を招くものです。実際には機能しません。

gc -TotalCount 25 C:\scripts\logs\robocopy_report.txt

PS 5.1でテストされた上記のスクリプトは、以下のような同じ応答です...

gc -head 25 C:\scripts\logs\robocopy_report.txt

したがって、すでに「-head 25」を使用してください。


こんにちは@ Patrick、Stack Overflowへようこそ!この質問に回答していただきありがとうございます。より詳細な説明を提供していただけますか?解決策を提供しようとしているのか、それとも問題についてコメントを追加しているだけなのかは不明です。
ロシオ・ガルシア・ルケ

コメントであり、欲求不満でもありました。「-headまだ行っていない『-TotalCount」何もない』だからではトータルカウントを取得するにはどのように誰もが知っている。?
パトリック・バーウェル

もう一度読んでください...私は答えに追加し、何が機能するかを明確にしました...
Patrick Burwell

1

Windowsで大きな(または小さな)ログファイルをクエリする必要がある場合、私が見つけた最良のツールはMicrosoftの無料のLog Parser 2.2です。必要に応じて、PowerShellから呼び出すことができます。これにより、非常に面倒な作業がすべて、非常に高速に行われます。


とにかく、私の環境はWin2k8R2で、Log Parser2.2のシステム要件に含まれていません
Yue Zhang

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

-1
$Push_Pop = $ErrorActionPreference #Suppresses errors
$ErrorActionPreference = SilentlyContinue #Suppresses errors
#Script
    #gc .\output\*.csv -ReadCount 5 | %{$_;throw "pipeline end!"} # head
    #gc .\output\*.csv | %{$num=0;}{$num++;"$num $_"}             # cat -n
    gc .\output\*.csv | %{$num=0;}{$num++; if($num -gt 2 -and $num -lt 7){"$num $_"}} # sed
#End Script 
$ErrorActionPreference = $Push_Pop #Suppresses errors

pushpopコードBTWですべてのエラーが発生するわけではありません。コードは「sed」オプションでのみ機能します。残りはすべて、gcとパス以外は無視します。

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