Unix head
コマンドと同等のものが必要です(出力の最初のN行を表示します)。これは私が現在使用しているものです:
tasklist | find /N " " | findstr /r \[[0-9]\]
上記のコードは、tasklist
の出力の最初の10行を表示します。 find /N " "
は、各行の先頭に行番号を付加し、findstr /r \[[0-9]\]
は、正規表現を使用して最初の10行を抽出します。
上記のコードは機能しますが、範囲を指定する必要があります。正規表現はWindowsの標準に従って実装されていないため、他に何も動作しません。
コマンド出力から任意の行を抽出するにはどうすればよいですか?これをワンライナーで行うことが重要です。スクリプトなし!
パワーシェル。
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行を表示します。
あなたがUnix系の人なら、おそらく CygWin をインストールすると、より身近な環境が得られます。
"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
...
壊す:
findstr
の正規表現は実際には正しく機能しています。問題は エスケープ です。 (詳細は Robのリファレンス を参照してください。)まず、dir/o-d
を使用して出力全体をダンプします。
次に、$Num:
を使用して、各行の先頭に「findstr/n ^^
」を追加します
^
は行頭に一致することを意味し、^^
はcmdを使用しているため、エスケープされたバージョンである必要があります。
注:find/n" "
はスペースのない行と一致しないため、findstr
を使用する必要があります。
最後に、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"
は、式a
、b
、またはc
のいずれかに一致する文字列を検索することを意味します。
これは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.