LINUX.ORG.RU

переменная из awk print в bash скрипте

 , ,


0

1

Добрый день!

имеется Bash крипт который делает селект в базу

echo "select ip from servers_process group by ip;" | mysql -u$login -p$pass -h $host $database |awk '{print $1}'

вывод

ip
172.17.0.22

вопрос, как сделать так чтобы выводил только ип адрес ? я нашел вариант, в целом устраивает но непонятно как использовать если awk должен будет выводить две поля

awk NR\ ==\ 2\{print\ \$1}

и самый главный вопрос, как этот ип адрес передать в переменную bash для дальнейшего использования в скрипте

Прежде чем задавать такие вопросы, надо хоть почитать что-нибудь для начала

awk 'NR==2 {print $1}' выведет вторую строку. 
Переменные так:
ip="$(command)"
Что имеется ввиду?:

если awk должен будет выводить две поля

Deleted
()
Последнее исправление: medossa (всего исправлений: 1)
echo "select ip from servers_process group by ip;" | mysql -sN -u$login -p$pass -h $host $database
anonymous
()
Ответ на: комментарий от Deleted

сейчас одна переменная нормально отображается

eval "$(echo "select ip from servers_process group by ip;" | mysql -sN -u$login -p$pass -h $host $database |awk '{print "ip="$1}')"

echo $ip

а если их две нужно то не знаю как поступить(

echo "select ip,name from servers_process group by ip;" | mysql -sN -u$login -p$pass -h $host $database |awk '{print $1$2}'
diakon2
() автор топика
Ответ на: комментарий от diakon2

Ты с eval аккуратнее.

ip=$(echo "select ip from servers_process group by ip;" | mysql -sN -u$login -p$pass -h $host $database |awk 'NR==2 {print}')
echo $ip

а если их две нужно то не знаю как поступить(

echo "select ip,name from servers_process group by ip;" | mysql -sN -u$login -p$pass -h $host $database |awk '{print}'
Deleted
()

Передавать пароль в аргументах - очень плохая идея, ведь любой другой пользователь может узнать пароль из простого ps aux. Перенеси пароль хотя бы в ~/.my.cnf.

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от Deleted

в массив\строку можно запихнуть весь вывод комманды которая выводит два слова (ip,hostname) и потом уже разделить этот вывод на две переменные, чтобы в одной было ip а во второй hostname ?

diakon2
() автор топика
Ответ на: комментарий от legolegs

отличная идея, хоть пользователей никаких на сервере не будет кроме меня, сделаю все равно именно так. как минимум можно будет избавиться от подключаемого файла.

тогда вопрос, раз скрипт запускается от рута, то файл My.cnf будет лежать в папке /root ? соответственно кроме рута и крона который запускает скрипт от рута, к этому файлу и паролям в нем никто не сможет получить доступ?

diakon2
() автор топика
Ответ на: комментарий от legolegs

Передавать пароль в аргументах - очень плохая идея

Справедливости ради, об этом, пусть не на 100%, но люди позаботились о проблеме. Хорошая идея для интервью: «что даёт дополнительное условие у таких утилит, которые требуют указания -pPASSWORD только так, то есть одним аргументом?»

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от diakon2

в массив\строку можно запихнуть весь вывод комманды и потом уже разделить этот вывод на две переменные,

str=$(echo "select ip,name from servers_process group by ip;" | mysql -sN -u$login -p$pass -h $host $database |awk '{print}')

name=$(echo "$str" | awk 'NR==1 {print}')
ip=$(echo "$str" | awk 'NR==2 {print}')
Deleted
()
Последнее исправление: medossa (всего исправлений: 1)
Ответ на: комментарий от Deleted
arr=($( echo "select ip,$avg from servers_process group by ip;" | mysql -sN -u$login -p$pass -h $host $database | awk '{print $1" "$2}'))

echo ${arr[0]}
echo ${arr[1]}

вот так заработало, в вашем примере почемуто пустые строки. но спасибо за совет, навел на мысль и все заработало.

небольшой вопрос, что означает

| cut -d' ' -f1
diakon2
() автор топика
Ответ на: комментарий от diakon2

-d' ' — пробел в качестве разделителя, -f1 — первый столбец.
Как awk '{print $1}', только резвее.

Hertz ★★★★★
()
Ответ на: комментарий от diakon2

Всё верно. Загнав вывод в переменную, в качестве разделителя будет пробел, а не новая строка. Поэтому делаем так:

str=$(echo "select ip,name from servers_process group by ip;" | mysql -sN -u$login -p$pass -h $host $database)

name=$(echo "$str" | awk '{print $1}')
ip=$(echo "$str" | awk '{print $2}')

или

name=$(echo "$str" | cut -d' ' -f1)
ip=$(echo "$str" | cut -d' ' -f2)
|awk '{print}' в первой строке не надо. С массивом кстати тоже норм.

Deleted
()
Ответ на: комментарий от Deleted

Всё верно.

Но пишите отвратно. Вот с одним fork+pipe для собствено mysql:

read -r -d'\n' name ip < <(mysql -sN -u$login -p$pass -h $host -e "select ip,name from servers_process group by ip;" $database)

vodz ★★★★★
()
Ответ на: комментарий от Deleted

Мне до такой красоты далеко)

Ну то не красота, то отвратительные башизмы :). Правильно так:

{ read name; read ip; } << EOF
$(mysql -sN -u$login -p$pass -h $host -e "select ip,name from servers_process group by ip;" $database)
EOF

vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.