Windowsでコマンド出力の最初のN行を表示する方法は?(Unixコマンド「head」に相当)


17

Unix headコマンドに相当するものが必要です(出力の最初のN行を表示します)。これは私が現在使用しているものです:

tasklist | find /N " " | findstr /r \[[0-9]\]

上記のコードは、tasklist出力の最初の10行を表示します。regexを使用して最初の10行を抽出しfind /N " "ながら、各行の先頭に行番号を追加しfindstr /r \[[0-9]\]ます。

上記のコードは機能しますが、範囲指定する必要があります。正規表現はWindowsの標準に従って実装されていないという事実のため、私は他に何も機能させることができません。

cmd出力から任意の行を抽出するにはどうすればよいですか?ワンライナーでこれを行うことが重要です。スクリプトなし!


.....................
giecsar

回答:


36

パワーシェル。

PS C:\> netstat | Select -First 20

編集:1989年頃にcmd.exeしか使用できないと主張するつもりですが、それは真実ではありません。PowershellはすべてのOSバージョンVista +に組み込まれており、XP / 2003にインストール可能です。それはあるのWindowsの未来。

編集:さて、あなたの方法を持っています。

C:\> netstat -an > temp.txt && for /l %l in (1,1,10) do @for /f "tokens=1,2* delims=:" %a in ('findstr /n /r "^" temp.txt ^| findstr /r "^%l:"') do @echo %b

netstatの出力の最初の10行を表示します。


5
PowerShellが未来であることは間違いありませんが、今は機能するものが必要です。企業の現実では、多くの場合、テクニカルサポート部門の顧客は何百ものWindowsサーバーを所有していますが、いずれもVista、7、または8を搭載していません。コマンドを実行するたびにPowerShellをインストールする時間を無駄にすることはできません。許可さえも。
-giecsar

cmd.exeのそれは...ある
ライアンリース

必要なのは、powershellコマンドを実行するためにログインできる1台のw2k8r2サーバーだけです、それは可能ですか?
トニーロス

2K8サーバーがあるかどうかはわかりませんが、Ryan Riesの答えはまさに私が必要としていたものです。ライアン、どうもありがとう!
-giecsar

1
忘れないでください...答えを...受け入れられたものとしてマークしてください...: `(角の胎児の位置で丸くなり、すすり泣きます
ライアン・リース

8

あなたがUnixタイプの人なら、CygWinをインストールすることで、より身近な環境が得られるでしょう。


2
いいえ、明確にしたと思いましたが、何もインストールできません。Windowsコマンドプロセッサ(cmd.exe)で実行する必要があります。PowerShell、CygWin、スクリプトはありません。
-giecsar

3

for」ループを使用するよりもはるかに簡単な簡単なソリューションがあります。

dir/o-ddir日付の逆順)からの出力を例としてみましょう。

たとえば、1行目から16行目を出力する場合は、次を使用します。

dir/o-d|findstr/n ^^|findstr "^[1-9]: ^1[0-6]:"

たとえば、行16〜45を出力する場合は、次を使用します。

dir/o-d|findstr/n ^^|findstr "^1[6-9]: ^[2-3][0-9]: ^4[0-5]:"

サンプル出力:

16:08/08/2016  08:43 AM    <DIR>          nacl_sdk
17:11/05/2016  10:48 PM    <DIR>          3b 2
18:28/04/2016  02:47 PM    <DIR>          sample
19:22/04/2016  10:07 PM    <DIR>          mysql test
20:16/04/2016  01:22 AM    <DIR>          3b
21:16/04/2016  01:10 AM             2,706 errorlog
22:16/04/2016  12:53 AM                 0 accesslog
...

壊す:

  1. まず、を使用して出力全体をダンプしdir/o-dます。

  2. 次に、各行の先頭に「$Num:」を使用してfindstr/n ^^

    • ^は、行の先頭に一致することを意味し、^^単にcmdにいるため、エスケープバージョンが必要です。

    • 注:スペースのない行とは一致しないfindstrため、これに使用する必要がありますfind/n" "

  3. 最後に、を使用して出力をトリミングしますfindstr "^1[6-9]: ^[2-3][0-9]: ^4[0-5]:"

    • ^1[6-9]: 16〜19の正規表現です。

    • ^[2-3][0-9]: 20〜39の正規表現です。

    • ^4[0-5]: 40〜45の正規表現です。

    • findstr "a b c"手段は、いずれかの表現に一致する文字列を検索abまたはc

/programming//q/8844868/632951も参照してください


それは素晴らしい解決策ですが、あなたはそこに接頭辞を付けた番号を持っています、最後のfindstr呼び出しでそれらを取り除くことができますか?
fschmitt

@fschmitt、findstr物事を削除することはできません。その場合は、ループの使用を余儀なくされる可能性があると思います。
Pacerier

0

これは1行のコマンドであり、皆さんにも役立つことを願っています。

@echo off&cls&for /f "tokens=*" %a in (Graph.bat) do echo %a&for /f "skip=1 tokens=*" %a in (Graph.bat) do echo %a&for /f "skip=2 tokens=*" %a in (Graph.bat) do echo %a&for /f "skip=3 tokens=*" %a in (Graph.bat) do echo %a&for /f "skip=4 tokens=*" %a in (Graph.bat) do echo %a&pause>nul

:: Run this from CMD.exe and make sure that your file is in your current working directory.

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