выключите буферизацию для 'hping' в OpenBSD

Можно сделать это как решение с двумя передачами в awk:

awk 'FNR == NR { n = $2; next } { print $1, $2/n }' infile infile

Если Ваша версия awk поддерживает блок ENDFILE (например, GNU awk 4 +), можно сделать это как это:

awk 'ENDFILE { n = $2 } FNR != NR { print $1, $2/n }' infile infile

Обратите внимание, что более эффективно seek в конец файла увидели ответ camh в первый раз.

Объяснение

Первый пример работает путем запоминания предыдущего $2, т.е. это только оценено когда счетчик местной линии (FNR) равно глобальному счетчику строки (NR). next управляйте пропусками к следующей строке, в этом случае она гарантирует, что последний блок только оценен, когда второй аргумент анализируется.

Второй пример имеет подобную логику, но использует в своих интересах блок ENDFILE, который оценен, когда конец входного файла достигнут.

2
23.05.2017, 15:40
2 ответа

Существует два общих решения, stdbuf и unbuffer.

stdbuf от GNU coreutils, он был добавлен в версии 7.5 в 2009, таким образом, он пробился ко всем существующим невстроенным системам Linux кроме CentOS 5. Это находится также в FreeBSD начиная с версии 8.4. Никакой другой вариант Unix еще не принял его, что я знаю о, и в особенности не OpenBSD с 5,4.

unbuffer Ожидать сценарий, и как таковой доступно, везде Ожидают, доступно, который включает в значительной степени любой Unix. Все варианты BSD имеют его в своем наборе порта, в expert пакет.

Так установите expect пакет и выполненный unbuffer hping … | perl …

4
27.01.2020, 21:57
  • 1
    Интересно, OS X 10.8 на середине 2013 MacBook Air действительно включает expect version 5.45 в /usr/bin/expect, однако, unbuffer кажется, отсутствует. –  cnst 25.11.2013, 04:22

Другая опция может состоять в том, чтобы использовать socat:

# cf. http://unix.stackexchange.com/a/25377
socat EXEC:'hping --icmp-ts example.ca',pty,ctty STDIO | perl -ne 'if ...
1
27.01.2020, 21:57

Теги

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