У меня есть команда, которая выводит данные в stdout ( command1 -p=aaa -v=bbb -i=4
). Выходная строка может иметь следующее значение:
rate (10%) - name: value - 10Kbps
Я хочу получить этот вывод, чтобы сохранить этот показатель (я думаю, что труба будет полезна здесь). И, наконец, я хотел бы, чтобы эта скорость была значением параметра для второй команды (скажем command2 -t=${rate}
)
Это выглядит сложно на моей стороне; Я хотел бы лучше узнать, как использовать трубы, grep, sed и так далее.
Я пробовал много комбинаций, подобных этой, но я запутался в этих:
$ command1 -p=aaa -v=bbb -i=4 | grep "rate" 2>&1 command2 -t="rate was "${rate}
Чтобы смоделировать вывод
command1
я использую это выражение эха:Быстрый тест:
Это все хорошо, так что давайте разберемся:
Таким образом, мы получаем нужную строку
command1
, давайте передадим ее вcommand2
:Я ожидаю
"rate was "$(command1 | grep 'rate')
объединения автоматически. Если это не сработает из-за пробелов, вы должны вместо этого передать ввод:источник
Попробуйте это с помощью grep & pcre :
источник
Первая задача - извлечь ставку из этой строки. С GNU grep (не встроенный Linux или Cygwin) вы можете использовать эту
-o
опцию. Часть, которую вы хотите, это та, которая содержит только цифры и сопровождается%
знаком. Если вы не хотите извлекать%
саму себя, вам нужен дополнительный трюк: предпросмотр с нулевой шириной , который ничего не соответствует, но только если за этим ничего не следует%
.Другая возможность - использовать sed. Чтобы извлечь часть строки в sed, используйте
s
команду с регулярным выражением, которое соответствует всей строке (начиная с^
и заканчивая$
), с частью, которую нужно сохранить в группе (\(…\)
). Замените всю строку содержанием группы (ов), чтобы сохранить. В общем, передайте-n
опцию, чтобы отключить печать по умолчанию и поместитьp
модификатор для печати строк, где есть что извлечь (здесь есть одна строка, так что это не имеет значения). См. Возврат только части строки после соответствующего шаблона и Извлечение регулярного выражения, сопоставленного с «sed», без печати окружающих символов для получения дополнительных уловок sed.Опять более гибкий, чем sed, это awk. Awk выполняет инструкции для каждой строки на небольшом императивном языке. Есть много способов извлечь ставку здесь; Я выбираю вторые поля (по умолчанию поля разделяются пробелами) и удаляю все символы в нем, которые не являются цифрами.
Следующий шаг, теперь, когда вы извлекли ставку, это передать ее в качестве аргумента
command2
. Инструментом для этого является команда susbtitution . Если вы поместите команду внутри$(…)
(круглая скобка), ее вывод подставляется в командную строку. Вывод команды разбивается на отдельные слова в каждом блоке пробелов, и каждое слово рассматривается как шаблон с подстановочными знаками; если вы не хотите , чтобы это произошло, поставить двойные кавычки вокруг подстановки команд:"$(…)"
. В двойных кавычках выходные данные команды используются непосредственно в качестве единственного параметра (единственное преобразование состоит в том, что новые строки в конце выходных данных удаляются).источник
Вы можете использовать
grep
и это PCRE - Perl-совместимые регулярные выражения. Это позволяет вам использовать вид сзади, чтобы соответствовать значению нормы, без включения строки «ставка» в ваши результаты при поиске.пример
подробности
Вышеуказанное
grep
работает следующим образом:-o
вернет только то, что мы ищем\d+
, то есть цифры в скобках.-P
включает функцию PCRE от grep(?<=^rate \()
будет возвращать только те строки, которые начинаются с "rate (")command2
Чтобы поймать значение «скорость» вы можете запустить
command1
так:Тогда для вашей второй команды вы просто используете эту переменную.
Вы можете получить фантазию и сделать все это одной строкой:
Это выполнит command1 внутри
$(..)
исполнительного блока, возьмет его результаты и включит их в-t=..
переключатель command2 .источник
Я обычно использую `command`, чтобы разместить вывод в качестве аргумента для другой команды. Например, чтобы найти ресурс, потребляемый процессом foo на freebsd, будет:
Здесь pgrep используется для извлечения PID процесса foo, который передается команде procstat, которая ожидает PID процесса в качестве аргумента.
источник