На самом деле существует небольшая разница между коммутатором и концентратором. Концентратор не хранит MAC-адреса подключенных устройств, поэтому пакеты, полученные от любого хоста, достигают всех остальных подключенных хостов. пакет соответствующему получателю, чьи данные (, такие как mac,ip ), упоминаются в заголовках пакетов....
Я могу придумать простой подход — использовать временное хранилище для вывода. Это можно сделать с минимальной модификацией вашего кода, например:
atmp=$(mktemp "/tmp/XXXXXX")
printf "%s\n" a b print c | tee $atmp |
if grep --quiet print
then
grep print $atmp
fi
rm $atmp #cleanup
Для небольших объемов производства это может быть приемлемым.
Другой подход, аналогичный ответу @Tagwint , состоит в том, чтобы сохранить результат grep print
в переменной оболочки, а затем вывести содержимое этой переменной только при наличии результатов поиска:
printf "%s\n" a print b print c |
if result=$(grep print)
then
echo "$result";
fi
Выход:
print
print
Это допустимо, если результаты поиска не слишком велики.
Я также решил проблему в этом конкретном примере, используя fionread
, который @mosvy реализовал в своем ответе наКак проверить, пуст ли канал, и запустить команда на данных, если это не так?.
printf "%s\n" a b print c | grep print |./fionread echo found
Выход:
found
printf "%s\n" a b c | grep print |./fionread echo found
Выход:
Обратите внимание, что gcc
легко компилируется fionread.c
на FreeBSD 11.3:
$ gcc -o fionread fionread.c
$ echo test | grep test |./fionread echo found
found
$ echo | grep test |./fionread echo found
$
Хотя это и не стандартная утилита Unix или скрипт Bash, я решил решить проблему в этом конкретном примере, используяifne
из moreutils:
printf "%s\n" a b print c | grep print | ifne echo found
Выход:
found
printf "%s\n" a b c | grep print | ifne echo found
Выход:
@Nick Wirth сослался на lfne
в своем ответе наКак проверить, пуст ли канал, и запустить команду для данных, если это не так?.
Спасибо @mosvy за то, что направили меня на этот существующий вопрос.