web-dev-qa-db-ja.com

WindowsでのAWKの同等の機能

追加のソフトウェアをインストールできないクライアントPCのいくつかの問題をトラブルシューティングする必要があり、Windows XPおよび7でのawkのいくつかの基本機能が必要です。

基本的に、netstatからプロセスIDを取り除く必要があるので、スクリプトのさまざまな部分でその行を使用できますが、awk '{ print $4 }'と同等のことができるネイティブコマンドの知識がありません。何かオプションはありますか?明らかに、私はwindows cliにかなり新しいです。

6
Grambot

プロセスID(PID)を取得するには:

  • cmd.exeを開き、次のように入力します。
  • tasklist /fi "imagename eq netstat.exe" > D:\test.txt

このコマンドは、プロセスIDがnetstatの新しいテキストファイルを作成します(netstatが実行されている場合)。
問題は、このファイルにはPID以外のものが含まれることです。

たぶんそれであなたが始めるのに十分ですか?

2
nixda

このような基本的なタスクには、 for /f を使用できます。

の代わりに

command | awk '{ print $4 }'

これを試して:

for /f "tokens=4" %a in ('command') do echo %a

バッチファイルでは%%aではなく%aを使用する必要があることに注意してください。

13
Dennis

netstat -n -oの出力例:

Active Connections

  Proto  Local Address          Foreign Address        State           PID
  TCP    127.0.0.1:12345        127.0.0.1:23456        ESTABLISHED     4321
  TCP    127.0.0.1:34567        127.0.0.1:45678        ESTABLISHED     5432

上位2行を削除するには、出力をfindstr /v "Active Proto"にパイプします。

ローカルアドレスやPIDなど、特定の列データのみを印刷するには、次のコマンドを使用します。

for /f "tokens=2,5" %i in ('netstat -n -o ^| findstr /v "Active Proto"') do @echo Local Address = %i, PID = %j

バッチファイルで使用する場合は、%記号を2倍にする必要があり、必要な値(%% i、%% jなど)を変数に割り当てることができます。

4
Karan

@Dennisの回答について詳しく説明すると、Cヘッダーファイルからバージョン番号を抽出し、それを使用して新しいファイル名を作成するために使用したスニペットを次に示します。

私のヘッダーファイルは次のようになります

 ... stuff
 #define FIRMWARE 8
 .. stuff

UNIXと同等

 f=`awk /FIRMWARE/ { print "image_v" $3 ".txt"; } project_config.`
 echo $f

dOSでは

 for /f "tokens=3" %%a in ('findstr FIRMWARE project_config.h') do (
   set f=image_v%%a.txt
 )

 echo %f%
1
Mark Lakata