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
Поведение по умолчанию, когда вывод записывается в терминал, должно быть буферизовано строкой, однако, когда оно направлено в файл или в другой процесс, использующий канал, оно буферизуется, возможно, порциями данных 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 должен определить, не подключен ли его стандартный выход к терминалу, и не должен испускать цветовые коды в этом случае.
Большинство программ командной строки, которые обеспечивают цветной терминальный вывод, достаточно умно для распознавания, когда их вывод не идет в терминал, и подавите цветовые коды. Это кажется этим 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'