Если я понимаю, что вы пытаетесь сделать, вы хотите добавить строки из файла $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 ... , но может быть проще для чтения.
С помощью ngrep
вы можете сделать следующее:
ngrep '\xff{6}(.{6})\1{15}'
Это соответствует 0xff 6 раз, за которым следуют любые 6 байтов, за которыми следуют те же самые 6 байтов, повторенные еще 15 раз. Я подтвердил, что это соответствует пакету, сгенерированному wakeonlan
.
ngrep
имеет параметры, полезные для сценариев (например, -W single
для создания одной строки на соответствующий пакет, -l
для отключения буферизации, -t
для меток времени, -q
для отключения другого вывода).