выражение grep, чтобы найти число

Я хотел бы найти номер в имени хоста. Обычно имя хоста серверов – это что-то вроде ниже

host01.host.name host02.host.name 

Я хочу получить 2 цифры до первого символа . который равен 01 или 02 и присваивает его переменной. Может ли кто-нибудь помочь мне с подходящей командой.

  • Что означает ^> в шаблоне grep?
  • Добавьте возврат каретки к выходу `tail` при использовании` grep`
  • Печать повторяющегося рисунка
  • Grep для строки, но игнорировать закомментированные элементы со строкой
  • Как grep число встречаемости двух разных слов в файле в Linux?
  • Как я могу перечислить все макеты и соответствующие варианты, которые не используют символы третьего уровня?
  • как подключить вывод cut к команде foreach?
  • как использовать grep -v в сценарии ожидания
  • 3 Solutions collect form web for “выражение grep, чтобы найти число”

    grep с PCRE ( -P ):

     grep -Po '^[^\d.]*\K\d+(?=\.)' file.txt 
    • ^[^\d.]* соответствует части до первых цифр от начала, также убедившись, что нет . перед цифрами \K отбрасывает совпадение

    • \d+ соответствует одной или нескольким цифрам

    • (?=\.) представляет собой положительный обратный шаблон с нулевой шириной, убедившись, что это так . спереди


    Поскольку будет несколько выходов, лучше сохранить их в массиве:

     output=( $(grep -Po '^[^\d.]*\K\d+(?=\.)' file.txt) ) 

    Теперь вы можете перебирать элементы массива или использовать их обычным массивом, обращаясь к манерам, например, чтобы получить значение n-го элемента, используя "${output[n]}" , чтобы все значения всех ключей использовали "${output[@]}" .


    sed :

     sed -E 's/^[^[:digit:].]*([[:digit:]]+)\..*/\1/' file.txt 
    • Подобно grep one, ^[^[:digit:].]* Соответствует части до первых цифр с начала, также убедившись, что нет . перед цифрами

    • ([[:digit:]]+) соответствует одной или нескольким цифрам и помещает их в захваченную группу 1

    • \..* соответствует a . а затем остальные

    • При замене используется только захваченная группа \1


    Пример:

     $ cat file.txt host01.host.name host02.host.name $ grep -Po '^[^\d.]*\K\d+(?=\.)' file.txt 01 02 $ sed -E 's/^[^[:digit:].]*([[:digit:]]+)\..*/\1/' file.txt 01 02 
     $ echo host01.host.name | grep --only-matching '[0-9]*' 01 

    Он использует основное регулярное выражение [0-9]* для согласования и согласование GNU Grep – --only-matching (или, может быть, -o для другого Grep) для фильтрации выходных данных.

     echo "host01.host.name host02.host.name" | sed 's/\..*//;s/[^0-9]*//' 

    или для вас;

     hostname | sed 's/\..*//;s/[^0-9]*//' 

    альтернативное решение:

     echo "host01.host.name host02.host.name" | grep -o "[0-9]*" | head -1 

    или для вас;

     hostname | grep -o "[0-9]*" | head -1 
    Interesting Posts

    Как проверить, соответствуют ли файлы, установленные пакетом, оригиналам?

    iwlwifi: таймаут задерживает прошивку для загрузки

    Имя сетевого интерфейса имеет со знаком – что это такое?

    xfce4-power-manager – невозможно отключить управление яркостью

    Запуск моего собственного приложения при запуске

    Использование pinentry с keepass2 для шифрования почты gpg

    Как проверить, содержит ли строка подстроку в тире или золе?

    Интерактивная сессия оболочки с Java

    Постоянное приглашение для пароля WPA2 в Fedora

    Управление набором контейнеров докеров в качестве инфраструктуры

    Выполнение команды на удаленном компьютере и перенаправление вывода в локальный файл

    нежелательные символы с Epson TM-H6000 на GNU / Linux

    Увеличение длины списка журналов (очередь журнала)?

    Как systemd обрабатывает размонтирование / usr при завершении работы, поскольку он установлен в initramfs?

    Как восстановить поврежденный файл tar.gz

    Linux и Unix - лучшая ОС в мире.