Вы можете запустить
ssh-copy-id user@server
, так что вам больше никогда не придется вводить пароль.
Перед этим вам нужно будет создать локальный ключ, что вы можете сделать, запустив
ssh-keygen
Предположим, что вывод этой команды сохраняется в файле с именем 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 [])
Вы можете использовать расширение параметра, чтобы заменить все, что не является цифрой, пробелом, а затем использовать разбиение на слова, чтобы прочитать результат в ваши переменные:
str='25 results [22 valid, 2 invalid, 1 undefined]'
read results valid invalid undefined <<< ${str//[![:digit:]]/ }
Расширение приводит к чему-то вроде
$ echo "${str//[![:digit:]]/ }"
25 22 2 1
и read
делают все остальное.
В любой оболочке 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.
Поскольку вы хотите хранить несколько отдельных значений, я предполагаю, что вы хотите хранить их в массиве:
$ 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]+' )
Предполагая, что ваш вывод находится в переменной с именем 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