Конвейер вводит альтернативные зависимости:nginx
зависит от одной из nginx-core
, nginx-full
, nginx-light
или nginx-extras
. Двойные зависимости используются для указания диапазона версий. (Ограничения полной зависимости здесь не видны, что говорит о том, что они недостаточны, но nginx-core
, -full
, -light
и -extras
конфликтуют друг с другом, что гарантирует, что «или» в набор зависимостей представляет собой «исключающее или».)
Вы увидите это яснее, если посмотрите на вывод apt show nginx
.
Если у вас есть доступ к GNUgrep
(по умолчанию в системах Linux ), это регулярное выражение будет захватывать цифры без каких-либо десятичных знаков в них.
grep -oP '\b(?<!\.)\d+(?!\.)\b'
регулярное выражение Объяснение:
\b
соответствует границе слова (?<!\.)
Отрицательный просмотр назад для подтверждения отсутствия десятичной дроби(.
)позади \d+
соответствует цифре один или несколько раз (?!\.)
Отрицательный просмотр вперед утверждает, что впереди нет десятичной дроби(.
)\b
соответствует границе слова Рассматривая строку как набор полей, разделенных пробелами -, вам нужно предпоследнее поле:
num=$( awk '{ print $(NF-1) }' <<<"$s" )
или, в оболочках без здесь -строк,
num=$( printf '%s\n' "$s" | awk '{ print $(NF-1) }' )
Это подает строку из $s
в команду awk
. Команда awk
выводит предпоследнее поле, разделенное пробелом -. Этот результат присваивается переменной num
.
Тестирование:
$ s="B /home/BL/004_010_0100.0 23 0.031"
$ num=$( awk '{ print $(NF-1) }' <<<"$s" )
$ printf 'num is "%s"\n' "$num"
num is "23"
Если ваши данные в $s
поступают из команды, вы можете напрямую передать их в awk
вместо сохранения в промежуточной переменной:
num=$( some-command | awk '{ print $(NF-1) }' )
grep
— это инструмент, который возвращает совпадающие строки (, игнорируя нестандартную -опцию -o
, доступную в некоторых реализациях инструмента ). Мы можем использовать grep
для выбора числа, если мы сначала преобразуем строку $s
в несколько строк на основе пробелов в строке:
$ tr -s '[:blank:]' '[\n*]' <<<"$s" | grep -x '[[:digit:]]\{1,\}'
23
Используемая здесь команда tr
изменяет строку с
B /home/BL/004_010_0100.0 23 0.031
в
B
/home/BL/004_010_0100.0
23
0.031
и команда grep
выбирает строку, которая только состоит из цифр (опция -x
заставит данный шаблон соответствовать полной строке ). Это, очевидно, будет работать только в том случае, если искомое число является положительным целым числом.
Если бы вы знали, что вас будет интересовать предпоследнее «поле», вы могли бы использовать tail
и head
вместо:
$ tr -s '[:blank:]' '[\n*]' <<<"$s" | tail -n 2 | head -n 1
23
...илиsed
:
$ tr -s '[:blank:]' '[\n*]' <<<"$s" | sed -n -e '${ g; p; }' -e h
23
Все вышеперечисленные варианты являются стандартными и портативными. Мы также можем использовать cut
для извлечения предпоследнего поля, если используем нестандартную -утилиту rev
для двойного обращения строки:
$ rev <<<"$s" | tr -s '[:blank:]' '[\t*]' | cut -f 2 | rev
23
Здесь мы также используем tr
для замены всех пробельных символов табуляцией (и сжимаем их в отдельные табуляции ). Затем cut
просто извлекает второе поле перед тем, как rev
снова инвертирует извлеченные данные.
Просто немного изменил ваш grep
. Если вы используете GNUgrep
(по умолчанию в системах Linux ), это должно работать:
s="B /home/BL/004_010_0100.0 23 0.031"
num=$(echo $s | grep -oP '\.*?\s+\d+\s+')
Вы можете попробовать это с Perl:
echo "$s" | perl -e 'for(<>){/B\s+.*?\s+(\d+)\s+/;print $1}'
Здесь мы находим строку с:
B
символ \s+
.*?\s+
(\d+)
-он сохраняется в $1
специальной переменной \s+
. Это регулярное выражение можно уточнить, (например. с операторами ^
и $
для указания начала и конца строки ).
Подробнее о регулярных выражениях.