Найти цифры в Вывод команды и сохранение его в качестве переменных

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

ssh-copy-id user@server

, так что вам больше никогда не придется вводить пароль.

Перед этим вам нужно будет создать локальный ключ, что вы можете сделать, запустив

ssh-keygen
3
12.09.2018, 20:07
5 ответов

Предположим, что вывод этой команды сохраняется в файле с именем output.txt, тогда вы можете использовать команды awkи grepследующим образом:

results=$(grep results output.txt | awk '{print $1}')    
valid=$(grep valid output.txt | awk '{print $3}' | tr -d [])
invalid=$(grep invalid output.txt | awk '{print $5}' | tr -d [])
undefined=$(grep undefinedoutput.txt | awk '{print $7}' | tr -d [])

Включите эти четыре строки в свой bash, где это уместно.

Вместо этого вы можете использовать только awkдля поиска совпадающего шаблона следующим образом:

results=$(awk '/results/{ print $1 }' output.txt)
valid=(awk '/valid/{ print $3 }' output.txt | tr -d [])
invalid=(awk '/invalid/{ print $5 }' output.txt | tr -d [])
undefined=(awk '/undefined/{ print $7 }' output.txt | tr -d [])
4
27.01.2020, 21:08

Вы можете использовать расширение параметра, чтобы заменить все, что не является цифрой, пробелом, а затем использовать разбиение на слова, чтобы прочитать результат в ваши переменные:

str='25 results [22 valid, 2 invalid, 1 undefined]'
read results valid invalid undefined <<< ${str//[![:digit:]]/ }

Расширение приводит к чему-то вроде

$ echo "${str//[![:digit:]]/ }"
25          22        2          1

и readделают все остальное.

2
27.01.2020, 21:08

В любой оболочке POSIX:

a='aja 25 results [22 valid, 2 invalid, 1 undefined]'

set --                         # clean the list of argumnets.
while [ ${#a} -gt 0 ]; do      # while a is not empty, loop.
    b=${a%%[0-9]*}             # extract leading characters that are not digits (if any).
    a=${a#"$b"}                # remove those from the source variable.
    b=${a%%[^0-9]*}            # extract the leading digits.
    set -- "$@" ${a:+"$b"}     # until a empty, add numbers to the list.
    a=${a#"$b"}                # remove the digits from the source string.
done

printf '<%s> ' "$@"; echo      # print the list of values.
0
27.01.2020, 21:08

Поскольку вы хотите хранить несколько отдельных значений, я предполагаю, что вы хотите хранить их в массиве:

$ str='25 results [22 valid, 2 invalid, 1 undefined]'

$ readarray -t arr < <( grep -E -o '[0-9]+' <<<"$str" )

Это считывает вывод grepв массив с именем arr. Команда grepвыводит каждое отдельное число, найденное в $str, в отдельной строке, сопоставляя расширенное регулярное выражение [0-9]+со строкой и извлекая каждое совпадение. grepчитает строку из "здесь -строка",и readarrayсчитывает результат grep, используя подстановку процесса.

Затем эти значения можно использовать как

$ printf 'value: %s\n' "${arr[@]}"
value: 25
value: 22
value: 2
value: 1

или, чтобы просмотреть отдельные значения, используйте, например,. "${arr[0]}", "${arr[1]}"и т. д. Массив содержит "${#arr}"значений.

results=${arr[0]}
valid=${arr[1]}
invalid=${arr[2]}
undefined=${arr[3]}

Чтение напрямую из команды:

readarray -t arr < <( mycommand | grep -E -o '[0-9]+' )
7
27.01.2020, 21:08

Предполагая, что ваш вывод находится в переменной с именем output, вы можете разделить его с помощью sed, оставив только пробелы и цифры, чтобы вы могли легко разделить «слова» на массив:

tim@host:~$ res=($(sed 's/[^0-9 ]*//g' <<< $output))
tim@host:~$ printf "results: %s\nvalid: %s\ninvalid: %s\nundefined: %s\n" "${res[@]}"
results: 25
valid: 22
invalid: 2
undefined: 1
4
27.01.2020, 21:08

Теги

Похожие вопросы