(仕様変更のため再更新)
ここにあるのは、識別文字列 (MAC アドレス文字列のフラグメントとして記述された OUI MAC アドレス部分) のリストと、このリストに対してチェックする必要があるデータ文字列のリストです。
私のソリューションではfileutil
、Tcl ライブラリのパッケージを使用しています。標準の Tcl コマンドを使用できるため、必ずしも必要ではありませんが、スクリプトが大幅に簡素化されます。
package require fileutil
使用するファイル名をいくつか定義します。
set filename(macaddr) MAC-ADDRESS.txt
set filename(iparp) IP-ARP.txt
set filename(output) output.txt
識別文字列リストが変更される可能性がある場合は、スクリプトを実行するたびにファイルから読み取ることができます。
set idlist [::fileutil::cat $filename(macaddr)]
または、これらのアドレスがめったに変更されない場合は、スクリプトにハードコードして、必要に応じて編集することができます。
set idlist {001c.7f 001c.ab 001b.de 001b.ff 001c.cd 001c.de e02f.6c e02f.7c}
出力ファイルの内容を空の文字列に設定します。
::fileutil::writeFile $filename(output) {}
これらのアドレスのいずれかに一致するファイル内の行を選択するにはIP-ARP.txt
、それをたどる方法がいくつかあります。私の提案は、fileutil::foreachLine
コマンドを使用することです。基本的な呼び出しは次のようになります。
::fileutil::foreachLine varName filename script
(最初のパラメーターは任意の変数名です。反復ごとに現在の行がその変数に格納されます。2 番目はトラバースするファイルの名前で、3 番目のパラメーターはそのファイルのすべての行に対して 1 回実行するスクリプトです。 .)
スクリプトは、コマンドを使用して ID 文字列に一致するコマンドを呼び出しますstring match
。代わりにコマンドを使用するregexp
こともできますが、この場合はまったく不要だと思います。ファイル内のすべての行はIP-ARP.txt
空白か、5 つの要素を持つ適切な Tcl リストです。MAC アドレスは 4 番目です。また、2 番目の要素は ip 番号で、172 で始まるものだけが使用されます。これは、一致するコマンドが次のように記述できることを意味します。
proc matchid {idlist line} {
set ipAddr [lindex $line 1]
set macAddr [lindex $line 3]
if {[string match 172* $ipAddr]} {
foreach id $idlist {
if {[string match $id* $macAddr]} {
return "$ipAddr $macAddr\n"
}
}
}
}
(この方法での IP アドレスの照合は、アドレスが小数点付き 10 進形式の場合にのみ機能します。他の形式の場合は、Tcllib ip モジュールを使用して照合する必要があります。)
コマンドの結果は、行が一致した場合は IP アドレスと MAC アドレスを含む行になり、一致しなかった場合は空の文字列になります。
IP-ARP.txt
次に、ファイルの内容をたどってみましょう。各行について、内容を id リストと照合し、出力文字列または空の文字列を取得します。文字列が空でない場合は、出力ファイルに追加します。
::fileutil::foreachLine line $filename(iparp) {
set res [matchid $idlist $line]
if {$res ne {}} {
::fileutil::appendToFile $filename(output) $res
}
}
以上です。完全なプログラム:
package require fileutil
set filename(macaddr) MAC-ADDRESS.txt
set filename(iparp) IP-ARP.txt
set filename(output) output.txt
set idlist [::fileutil::cat $filename(macaddr)]
::fileutil::writeFile $filename(output) {}
proc matchid {idlist line} {
set ipAddr [lindex $line 1]
set macAddr [lindex $line 3]
if {[string match 172* $ipAddr]} {
foreach id $idlist {
if {[string match $id* $macAddr]} {
return "$ipAddr $macAddr\n"
}
}
}
}
::fileutil::foreachLine line $filename(iparp) {
set res [matchid $idlist $line]
if {$res ne {}} {
::fileutil::appendToFile $filename(output) $res
}
}
Tcllib fileutil モジュールのドキュメント
ドキュメント: foreach、if、lindex、package、proc、set、string
(注: コメントで言及されている 'Hoodiecrow' は私です。以前にそのニックネームを使用しました。)