Tomsk Sysadmins Forum
Unix => Программирование => Topic started by: lsk on June 02, 2006, 14:33:18
-
Час добрый всем!
Вопросик возник небольшой, может кто имел с этим дело..
Так вот, можно ли скриптом на Bash'е забрать информацию с MySQL (значение одного из полей) или несколько полей. К примеру, если в одном поле стоит 1, то с другого забрать адрес IP и положить в файл, иначе удалить из файлика IP адрес?
заранее благодарен
-
Час добрый всем!
Вопросик возник небольшой, может кто имел с этим дело..
Так вот, можно ли скриптом на Bash'е забрать информацию с MySQL (значение одного из полей) или несколько полей. К примеру, если в одном поле стоит 1, то с другого забрать адрес IP и положить в файл, иначе удалить из файлика IP адрес?
заранее благодарен
mysql db -e 'mysqlquerry'
mysql test -e 'SELECT * FROM tab' например - в шеле получишь вывод - что с ним делать решать тебе и писать уже на sh
-
короче так не прокатило, я немного поменял:
#!/bin/sh
mysql -h localhost -u root -p db_test --password=******
"SELECT `ip`, `check` FROM `user` WHERE `check`=1;"
mysql QUIT
так вот, соединяется просто отлично с базой, но выдает
./sqlbash: line 5: check: command not found
./sqlbash: line 5: user: command not found
./sqlbash: line 5: check: command not found
почему же не sql свои команды смотрит?
как сделать так, чтобы он просматривал после соединения строку, начинающуюся с mysql> ..далее SELECT `ip`, `check` FROM `user` WHERE `check`=1;
просто этот запрос в самом sql отрабатывается на ура
-
короче так не прокатило, я немного поменял:
#!/bin/sh
mysql -h localhost -u root -p db_test --password=******
"SELECT `ip`, `check` FROM `user` WHERE `check`=1;"
mysql QUIT
так вот, соединяется просто отлично с базой, но выдает
./sqlbash: line 5: check: command not found
./sqlbash: line 5: user: command not found
./sqlbash: line 5: check: command not found
почему же не sql свои команды смотрит?
как сделать так, чтобы он просматривал после соединения строку, начинающуюся с mysql> ..далее SELECT `ip`, `check` FROM `user` WHERE `check`=1;
просто этот запрос в самом sql отрабатывается на ура
А может все таки документацию по mysql и по bash почитать.
Естественно, что это баш пытается выполнить скрипт по строчно, нужно писать в одной строке и не забыть ключик -e.
Или Вы думаете, что волшебным образом управление перейдет от баша к mysql и дальше скрипт будет интерпретировать mysql?
Вероятнее выглядеть должно такRESULT=`mysql -h localhost -u root -D db_test --password=****** -e "SELECT `ip`, `check` FROM `user` WHERE `check`=1;"`
$RESULT содержит результат и с ним можно работать дальше.
Я бы конечно не насиловал себя башем, а написал скрипт на перле.
-
хм, да чего только я уже не пробывал и встрочку и "в столбик" все уже пробывал и -e и другие ключи, все равно баш "думает", что это его команды
вот что ваша строчка выдает с использованием моих данных:
./sqlbash: command substitution: line 7: unexpected EOF while looking for matchi
ng `"'
./sqlbash: command substitution: line 8: syntax error: unexpected end of file
./sqlbash: line 7: ,: command not found
./sqlbash: line 7: FROM: command not found
./sqlbash: line 7: WHERE: command not found
./sqlbash: command substitution: line 7: unexpected EOF while looking for matchi
ng `"'
./sqlbash: command substitution: line 8: syntax error: unexpected end of file
-
что-то мне подсказывает что строчка неправильно приведена.
-
lsk, а может имена столбцов надо в кавычки брать? А не использовать символ `. При обрамлении этим символом bash пытается выполнить несуществующую команду с именем столбца, и подставить в строку результат выполнения.
-
lsk, а может имена столбцов надо в кавычки брать? А не использовать символ `. При обрамлении этим символом bash пытается выполнить несуществующую команду с именем столбца, и подставить в строку результат выполнения.
Да, я как-то не обратил внимание на то, что там апострофы "обратные", тут два выхода -- или заменить их прямыми или заключить команду в одинарные кавычки
RESULT=`mysql -h localhost -u root -D db_test --password=****** -e 'SELECT `ip`, `check` FROM `user` WHERE `check`=1;'`
За подробным объяcнением фокуса с "" и '' отправляю в man bash
-
короче так не прокатило, я немного поменял:
#!/bin/sh
mysql -h localhost -u root -p db_test --password=******
"SELECT `ip`, `check` FROM `user` WHERE `check`=1;"
mysql QUIT
так вот, соединяется просто отлично с базой, но выдает
./sqlbash: line 5: check: command not found
./sqlbash: line 5: user: command not found
./sqlbash: line 5: check: command not found
почему же не sql свои команды смотрит?
как сделать так, чтобы он просматривал после соединения строку, начинающуюся с mysql> ..далее SELECT `ip`, `check` FROM `user` WHERE `check`=1;
просто этот запрос в самом sql отрабатывается на ура
А потому и пишет, что за один раз в sh выполняется только одна строка и нельзя делать какую-то последовательность комманд.
Тебе это надо всё скопом передавать. Потому, выглядеть это должно вот так:
#!/bin/sh
mysql -h localhost -u root -p db_test --password=****** -e '"SELECT `ip`, `check` FROM `user` WHERE `check`=1;"'
символом ' можно переносить строки, есть ещё такие символы, т.е. можно написать тоже самое вот так и будет работать
mysql -h localhost -u root -p db_test --password=****** -e '
"SELECT `ip`, `check` FROM `user` WHERE `check`=1;"
'
-
НЕ РАБОТАЕТ
по прежнему говорит, что таких команд для BASHa не существует, это и понятно... и ругается опять на ковычки
SATAN, вот чего выдает на твою строчку:
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the ma
nual that corresponds to your MySQL server version for the right syntax to use n
ear '"SELECT `ip`, `check` FROM `user` WHERE `check`=1;"' at line 1
-
НЕ РАБОТАЕТ
по прежнему говорит, что таких команд для BASHa не существует, это и понятно... и ругается опять на ковычки
SATAN, вот чего выдает на твою строчку:
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the ma
nual that corresponds to your MySQL server version for the right syntax to use n
ear '"SELECT `ip`, `check` FROM `user` WHERE `check`=1;"' at line 1
mysql -h localhost -u root -p db_test --password=****** -e '
SELECT ip, check FROM user WHERE check=1
'
вот так напиши и не парься
-
спасибо огромное работает.., но только если еще ковычки обратные поставить:
mysql -h localhost -u root -D inet_access --password=lauter -e '
SELECT `ip` FROM `user` WHERE `check`=1;
'
-
спасибо огромное работает.., но только если еще ковычки обратные поставить:
mysql -h localhost -u root -D inet_access --password=lauter -e '
SELECT `ip` FROM `user` WHERE `check`=1;
'
вообще наличие кавычек ' ` или " зависит как-то напрямую от того в какой кодировке собрал mysql - я сам не знаю почему, но допустим конструкция с обратными кавычками у кого-то может не сработать, зато сработает вариант совсем без них
-
Кстати, а правда, почему бы не написать скрипт на perl? Проще, надёжнее и быстрее работать будет. К тому же не будет проблем с обработкой результатов.
-
Кстати, а правда, почему бы не написать скрипт на perl? Проще, надёжнее и быстрее работать будет. К тому же не будет проблем с обработкой результатов.
Видимо потому, что автор вопроса даже не удосужился хоть раз почитать руководство по bash, да он даже советов не слушает.
mysql -h localhost -u root -D db_test --password=****** -e 'SELECT `ip`, `check` FROM `user` WHERE `check`=1;'
Прекрасно работает.
На крайний случай экранирование спец символов тоже никто не отменял
RESULT=`mysql -h localhost -u root -D db_test --password=****** -e 'SELECT \`ip\`, \`check\` FROM \`user\` WHERE \`check\`=1;'`
echo $RESULT;