![Анализ вывода ожидаемой переменной и использование его в скрипте bash](https://rvso.com/image/170283/%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%20%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%D0%B0%20%D0%BE%D0%B6%D0%B8%D0%B4%D0%B0%D0%B5%D0%BC%D0%BE%D0%B9%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9%20%D0%B8%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%B5%D0%B3%D0%BE%20%D0%B2%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B5%20bash.png)
У меня есть скрипт bash, который использует expect внутри скрипта bash. Этот скрипт bash запросит пароль внутри части expect скрипта, а затем вернет какой-то вывод. Я хочу взять этот вывод и проанализировать его так, чтобы он отображал мне только часть вывода и сохранял ее в переменной, которую может использовать обычный скрипт bash. Мой скрипт:
#!/bin/sh
output=$(
/usr/bin/expect << EOF
spawn -noecho generate passcode -a 123456789
expect "passphrase:" { send "password\n" }
expect eof
EOF
#)
) | awk '/^ [a-zA-Z]*: (\S+)/'
echo $output
Вывод, который я получаю без awk regex, таков:
Passcode: 543245324532455464
Мое regex проанализирует вывод и сохранит только 543245324532455464
значение в выходной переменной. Я на это и надеялся. Если я добавлю | awk '/^ [a-zA-Z]*: (\S+)/'
в конец команды, она ничего не вернет, просто пустое значение. Если я уберу его, она вернет ожидаемый мной вывод.
Может ли кто-нибудь подсказать, как мне сохранить правильные данные в моей переменной в bash?
решение1
Как написано, вы захватываете вывод /usr/bin/expect, а затем ничего не передаете в awk - закрывающая скобка подстановки команды должна находиться в конце конвейера.
нет
... ) | awk '/^ [a-zA-Z]*: (\S+)/'
но
... | awk '/^ [a-zA-Z]*: (\S+)/')
Имейте в виду, что \S
это нестандартно (PCRE) и может не поддерживаться во всех версиях awk, а группа захвата, скорее всего, не даст никакого эффекта — вам может подойти что-то вроде
awk -F': ' '$1 ~ /Passcode/ {print $2}'