Глубокая проверка пакетов для обнаружения WOL

Если я понимаю, что вы пытаетесь сделать, вы хотите добавить строки из файла $ADD в файл $TARGET, но без добавления строк, которые уже существуют?

Я думаю, есть более простые способы, чем повторный поиск. comm может дать вам строки, которые существуют только в первом, втором или обоих двух файлах, так что давайте воспользуемся этим:

comm -23 <(sort "$ADD") <(sort "$TARGET") > tmp ; cat tmp >> "$TARGET"

Аргумент -23 означает not показать строки, присутствующие только в файле 2, а not показать строки, присутствующие в обоих (3). Входные данные должны быть отсортированы, и я делаю аппенд через временный файл на всякий случай.

Решение методом грубой силы с sort и uniq тоже может сработать...

cat "$ADD" "$TARGET" | sort | uniq > tmp ; mv tmp "$TARGET"

Это, конечно, отсортирует полученный файл (и удалит все ранее существовавшие дублирующиеся строки).

(Конечно, вы можете захотеть сделать более уникальное имя временного файла.)


Что касается кода в его нынешнем виде, я думаю, что условие для fgrep инвертировано, поскольку grep возвращает 0, если найдено совпадение, а в отличие от большинства сред программирования, ноль действует как true в сценариях оболочки. Также something | while read ... должно работать так же, как while ... , но может быть проще для чтения.

3
09.05.2017, 18:31
1 ответ

С помощью ngrep вы можете сделать следующее:

ngrep '\xff{6}(.{6})\1{15}'

Это соответствует 0xff 6 раз, за ​​которым следуют любые 6 байтов, за которыми следуют те же самые 6 байтов, повторенные еще 15 раз. Я подтвердил, что это соответствует пакету, сгенерированному wakeonlan.

ngrep имеет параметры, полезные для сценариев (например, -W single для создания одной строки на соответствующий пакет, -l для отключения буферизации, -t для меток времени, -q для отключения другого вывода).

2
27.01.2020, 21:25

Теги

Похожие вопросы