Извлечь число из постоянного вывода в Bash - PullRequest
0 голосов
/ 16 октября 2018

У меня есть скрипт, который создает этот вид потока вывода в бесконечном цикле:

m  17:24:34|ethminer  Speed 377.61 Mh/s    gpu/0 29.01  gpu/1 29.91  gpu/2 30.21  gpu/3 28.71  gpu/4 28.11  gpu/5 27.96  gpu/6 28.71  gpu/7 29.01  gpu/8 28.48  gpu/9 28.86  gpu/10 29.91  gpu/11 29.08  gpu/12 29.68  [A1484+5:R0+0:F0] Time: 04:19

Я хочу извлечь целое число после «Speed», которое в данном случае равно 377.Итак, предположим, что строка называется string:

$string |  grep -oP '(?<=Speed).*'

Я получил

377.61 Mh/s    gpu/0 29.01  gpu/1 29.91  gpu/2 30.21  gpu/3 28.71  gpu/4 28.11  gpu/5 27.96  gpu/6 28.71  gpu/7 29.01  gpu/8 28.48  gpu/9 28.86  gpu/10 29.91

Я хочу избавиться от конечной строки, выполнив:

$string |  grep -oP '(?<=Speed).*'  | grep -o -E '[1-9][0-9][0-9]*'

но это регулярное выражение неверно, оно ничего не дает.Как я могу это исправить?

С уважением

Ответы [ 5 ]

0 голосов
/ 16 октября 2018

sed тоже работает.

$: echo $string | sed -En '/ Speed /{ s/.* Speed ([0-9]+).*/\1/; p; }'
377
0 голосов
/ 16 октября 2018

Не могли бы вы попробовать следующее.Учитывая, что ваш файл Input_file совпадает с показанными примерами.

awk '{sub(/.*Speed /,"");sub(/ .*/,"")} 1' Input_file

Если вы хотите сохранить выходные данные в самом файле Input_file, попробуйте выполнить следующее.

awk '{sub(/.*Speed /,"");sub(/ .*/,"")} 1' Input_file > temp_file && mv temp_file Input_file

Объяснение: Здесь также добавлено объяснение.

awk '                  ##awk script starts from here.
{
  sub(/.*Speed /,"")   ##Using sub for substitution operation which will substitute from starting of line to till Speed string with NULL fir current line.
  sub(/ .*/,"")        ##Using sub for substitution of everything starting from space to till end in current line with NULL.
}
1                      ##Mentioning 1 will print edited/non-edited lines in Input_file.
' Input_file           ##Mentioning Input_file name here.
0 голосов
/ 16 октября 2018
awk 'match($0,"Speed [0-9]+.?[0-9]*"){print substr($0,RSTART+6,RLENGTH-6)}'
sed '/Speed/s/.*Speed \([^ ]*\).*/\1/'

и если каждая строка всегда одинаково отформатирована, вы можете сделать:

awk '{print $6}' file

Это означает, что каждая строка всегда имеет скорость слова в столбце 5, и вы хотите напечатать столбец6.

0 голосов
/ 16 октября 2018

Если на выходе это всегда , как это (то есть не лишние строки между ними), простой cut -d' ' -f6 сделает работу.

0 голосов
/ 16 октября 2018

Вы можете использовать

grep -Po 'Speed\s*\K\d+'

Или, чтобы получить дробную часть, если это необходимо

grep -Po 'Speed\s*\K\d+(\.\d+)?'

См. онлайн-демонстрацию

Подробности

  • Speed - буквальная подстрока
  • \s* - 0+ пробелов
  • \K - совпадениеоператор сброса (отбрасывает весь текст, сопоставленный так далеко от значения совпадения)
  • \d+ - 1+ цифр
  • (\.\d+)? - необязательная последовательность . и 1+ цифр
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...