(снова обновляется за счет изменения спецификации)
То, что мы имеем здесь список идентификации строк (адрес частей OUI MAC записаны в виде фрагментов строку адреса 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
(Первый параметр является произвольным именем переменной: на каждой итерации текущей строки будут сохранены в этой переменной Второе имя файла траверсировать, и третий. Параметр - это сценарий для запуска один раз для каждой строки в этом файле.)
Сценарий вызывает команду, которая соответствует строкам id с помощью команды string match
. Вместо этого можно было бы использовать команду regexp
, но я думаю, что в этом случае это совершенно необязательно. Каждая строка в файле IP-ARP.txt
либо пустой, либо правильный список Tcl с пятью элементами, где MAC-адрес является четвертым. Кроме того, вторым элементом является номер 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"
}
}
}
}
(Matching адреса IP-таким образом, работает только если адрес в десятичном формате десятичного: если он может быть в любой другой форме IP-модуле Tcllib следует использовать для его соответствия.)
Результатом команды является либо строка, содержащая IP-адрес и MAC-адрес, если соответствующая строка, либо пустая строка, если это не так.
Теперь можно пройти содержимое файла IP-ARP.txt
. Для каждой строки сопоставляйте содержимое с идентификационным списком и получаете либо выходную строку, либо пустую строку. Если строка не пуста, добавьте ее в выходной файл.
::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 module
Документация: foreach, if, lindex, package, proc, set, string
(Примечание: «Hoodiecrow », упомянутый в комментарии это я, я что Ник ранее)
@Bohemian Done! Я перефразирую и удаляю свои комментарии. Благодаря! –