Bash: извлечь 2-е целое число из тестовой строки - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть строка, которая может содержать 2 или более целых чисел. Я пытаюсь извлечь только 2-е целое число, но следующий код печатает все вхождения: данный TEST_STRING.

Ответы [ 4 ]

1 голос
/ 21 апреля 2020

Использование оператора bash =~:

$ test_string="207 - 11 (INTERRUPT_NAME) 0xffffffff:0xffffffff"
$ [[ $test_string =~ [0-9]+[^0-9]+([0-9]+) ]] && [[ ! -z ${BASH_REMATCH[1]} ]] && echo ${BASH_REMATCH[1]}
11

Объяснено:

  • [[ $test_string =~ [0-9]+[^0-9]+([0-9]+) ]], если $test_string имеет подстроку
    целое число - нецелое число - целое число , последнее целое число установлено в переменную ${BASH_REMATCH[1]}
  • && и
  • [[ ! -z ${BASH_REMATCH[1]} ]] что-то фактически установлено в переменную
  • && «затем»
  • echo ${BASH_REMATCH[1]} вывести переменную
0 голосов
/ 21 апреля 2020

Использование вспомогательной переменной:

TEST_STRING="207 - 11 (INTERRUPT_NAME) 0xffffffff:0xffffffff"
# Remove everything until the space in front of the 11
temp=${TEST_STRING#*- }
# Remove what comes afterwards
ERROR_COUNT=${temp%% *}

Предполагается, что после счетчика ошибок следует -, один пробел и пробел.

0 голосов
/ 21 апреля 2020

Вот мой пример, использующий read для анализа отдельных переменных:

TEST_STRING="207 - 11 (INTERRUPT_NAME) 0xffffffff:0xffffffff"
read num sep ERROR_COUNT rest <<<"$TEST_STRING"
echo ${ERROR_COUNT}
11
0 голосов
/ 21 апреля 2020
#!/bin/bash

TEST_STRING=$(echo "207 - 11 (INTERRUPT_NAME) 0xffffffff:0xffffffff")

ERROR_COUNT="$( echo "${TEST_STRING}" | awk '{print $3}' )"

echo "${ERROR_COUNT}"

Вывод:

11
...