web-dev-qa-db-ja.com

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

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

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

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

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

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

18
giecsar

パワーシェル。

PS C:\> netstat | Select -First 20

編集:私はあなたが1989年頃にcmd.exeしか使用できないと主張するつもりだと感じていますが、それは本当ではありません。 PowershellはすべてのOSバージョンVista +に組み込まれており、XP/2003にインストールできます。それis 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行を表示します。

37
Ryan Ries

あなたがUnix系の人なら、おそらく CygWin をインストールすると、より身近な環境が得られます。

8
vonbrand

"for"ループを使用するよりもはるかに簡単な簡単な解決策があります。

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

例えば。 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を使用しているため、エスケープされたバージョンである必要があります。

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

  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のいずれかに一致する文字列を検索することを意味します。

https://stackoverflow.com/q/8844868/632951 も参照してください

3
Pacerier

これは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.
0
hidde663