Проблемы объединить команды в цепочку

Sooo, я пытаюсь зарегистрировать свой ethminer hashrate, однако я испытываю некоторые затруднения для объединения в цепочку вывода egrep / grep в другой, я даже попробовал различными командами (sed/cat...), ни один, кажется, на самом деле не получает вида вывода, я не могу даже перенаправить stdout в файл! Странная часть; когда я не пытаюсь объединить в цепочку или перенаправить что-либо, это печатает то, что это, как предполагается, на терминале!

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

вот команда, которую я хотел бы отфильтровать:

/home/USER/ethminer -U -S eu1.ethermine.org:4444 -O 0x*****************.********** --cuda-parallel-hash 4

произведите это (это производит о немного больше, чем строка/секунда, и это должно работать в основном навсегда):

  ℹ  23:36:26|CUDA0     set work; seed: #4be89018, target:  #0000000112e0
  ℹ  23:36:26|CUDA0     set work; seed: #4be89018, target:  #0000000112e0
  m  23:36:28|ethminer  Speed  20.01 Mh/s    gpu/0 20.01  [A0+0:R0+0:F0] Time: 00:00
  m  23:36:30|ethminer  Speed  22.13 Mh/s    gpu/0 22.13  [A0+0:R0+0:F0] Time: 00:00

Вещью, которые интересуют меня, является часть после Скорости, хотя существуют скрытые символы, вот что цепочечное

  cat -e 

дисплеи:

^[[32m  m  ^[[35m23:38:10^[[0m^[[30m|^[[34methminer^[[0m  Speed ^[[1;36m 23.09^[[0m Mh/s    gpu/0 ^[[36m23.09^[[0m  [A0+0:R0+0:F0] Time: 00:00^[[0m$

отметьте "Скорость ^ [[1; 36 м 23,09 дюйма, я использую 'm' в качестве ссылки для нахождения hashrate в выражении с m [[:digit:]]+\.[[:digit:]]{2} (btw Вы будете видеть, что я должен перенаправить stderr в stdout, это вызвано тем, что ethminer, кажется, производит hashrate в stderr канале... вид странных...), Это дает мне:

/home/USER/ethminer -U -S eu1.ethermine.org:4444 -O 0x*****************.********** --cuda-parallel-hash 4 2>&1 | cat -e | egrep -o --color=never "m [[:digit:]]+\.[[:digit:]]{2}" | egrep -o [[:digit:]]+\.[[:digit:]]{2}$

этот вывод меня, что это, как предполагается, делает:

m 0.00
m 15.74
m 19.41

Таким образом, до сих пор Это - весь OK..., но после этого... все становится странным... Я havn't удалось не получить вывод... даже на моем терминале ни от какой цепочечной команды, я попробовал много вещей, от проигрывания с перенаправлением stderr и stdout о везде, испытанная кошка: никакой вывод, играемый немного с sed: никакая удача, с grep: не больше шанс, чем с sed... Idealy я хотел бы что-то вроде этого:

/home/USER/ethminer -U -S eu1.ethermine.org:4444 -O 0x*****************.********** --cuda-parallel-hash 4 2>&1 | cat -e | egrep -o --color=never "m [[:digit:]]+\.[[:digit:]]{2}" | egrep -o [[:digit:]]+\.[[:digit:]]{2}$ >> /home/USER/mining.log

Который произвел бы:

22.26
22.47

в файле mining.log...

На помощь!

Править: ethminer прибывает отсюда: https://github.com/ethereum-mining/ethminer это является версией 0.12.0

UDATE: ответ egmont закончил тем, что работал, если я понимаю правильно, что это из-за способа, которым данные, отправленные через каналы, буферизуются с ethminer..., вот команда, которую я закончил тем, что использовал:

stdbuf -oL ethminer [arguments] 2>&1 | stdbuf -oL cat -e | stdbuf -oL egrep -o "m [0-9]+\.[0-9]{2}" | stdbuf -oL egrep -o "[0-9]+\.[0-9]{2}" >> mining.log
0
задан 28 November 2017 в 20:38

2 ответа

Поведение по умолчанию, когда вывод записывается в терминал, должно быть буферизовано строкой, однако, когда оно направлено в файл или в другой процесс, использующий канал, оно буферизуется, возможно, порциями данных 4 КБ или 8 КБ. То есть, ваш администратор должен напечатать это большое количество данных, чтобы первый блок действительно был записан и стал доступен для следующего этапа в вашей временной шкале.

Используйте stdbuf, чтобы включить режим линейной буферизации, даже если вывод переходит к другому процессу, например, stdbuf -oL ethminer [parameters] | cat-or-grep-or-whatever.

По той же причине, если у вас более длинный конвейер, возможно, все фазы, но последний, необходимо заменить на буферизованную линию, что-то вроде: stdbuf -oL ethminer | stdbuf -oL cat -e | stdbuf -oL egrep pattern1 | egrep pattern2.

Цвета не имеют отношения к этой истории, хотя, как указано в другом ответе, ethminer должен определить, не подключен ли его стандартный выход к терминалу, и не должен испускать цветовые коды в этом случае.

0
ответ дан 28 November 2017 в 20:38

Большинство программ командной строки, которые обеспечивают цветной терминальный вывод, достаточно умно для распознавания, когда их вывод не идет в терминал, и подавите цветовые коды. Это кажется этим ethminer не.

Ваше решение состояло в том, чтобы преобразовать непечатаемые коды ANSI в использование простого текста cat -e, и затем проанализируйте это. Альтернатива (и возможно более устойчивый) обходное решение могло бы быть должно разделить цветовые коды - один способ сделать, который использует perl Термин:: модуль ANSIColor, например.

/home/USER/ethminer -U -S eu1.ethermine.org:4444 -O 0x*****************.********** --cuda-parallel-hash 4 2>&1 | 
  perl -MTerm::ANSIColor=colorstrip -lne 'print colorstrip $_' | grep ...

Однако, если мы собираемся сделать это, мы можем также использовать perl вместо grep сделать соответствие. Существует много способов сделать, это - вот то:

  • разделите строку на разделенный массив пробела @F
  • звонить colorstrip на @F и сохраните результаты в @a
  • найдите индекс соответствия элемента массива Speed, затем ищите и распечатайте следующий элемент

напр.

/home/USER/ethminer -U -S eu1.ethermine.org:4444 -O 0x*****************.********** --cuda-parallel-hash 4 2>&1 | 
  perl -MTerm::ANSIColor=colorstrip -alne '@a = colorstrip @F; print map { $a[$_+1] } grep { $a[$_] eq "Speed" } 0..$#a'
1
ответ дан 28 November 2017 в 20:38

Другие вопросы по тегам:

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