我正在尝试了解有关shell脚本的更多信息,如果有人愿意教育/批评特别使用 awk ,请将其拼凑在一起。因为它基于执行查询的每个值,这是一个可行的选择吗?有没有更好的方法,即。 for或while循环?
timestamp = $(date "+%Y=%m-%d %H:%M:%S")
user_dir = "server_dir_name"
backup_path = "/home1/$user_dir/public_html"
local_bckup_store = "/home1/$user_dir/backups"
db_prefix = "database_prefix"
db_user = "database_username"
db_pwd = "database_user_password" //used here for simplicity, not security
tar -zcvf "$local_bckup_store/$user_dir-public_html-$timestamp.tar.gz" $backup_path
mysql -NBr -u$db_user -p$db_pwd -Dinformation_schema -e "SELECT schema_name FROM schemata WHERE schema_name LIKE '/$db_prefix_%/"';"
| awk '{ system("mysqldump -u$db_user -p$db_pwd $1 > $local_bckup_store/$1.$timestamp.sql | gzip" $1) }'
我将解决存储* $ db_pwd *的安全问题,即使它将在服务器上本地存储和运行,但是会对最佳实践的一些输入表示赞赏。
感谢。
答案 0 :(得分:1)
你真的只是使用awk来获取从mysql语句返回的第一个参数。
我建议将该参数保存在变量中,然后用它做你想做的事。
更新示例(我认为这就是你想要的):
e.g。
while read schema_name ; do
backup_file=${local_bckup_store}/${schema_name}.${timestamp}.sql
mysqldump -u${db_user} -p${db_pwd} ${schema_name} > ${backup_file}
gzip ${backup_file}
done < `mysql -NBr -u${db_user} -p${db_pwd} -Dinformation_schema -e "SELECT schema_name FROM schemata WHERE schema_name LIKE 'db_prefix_%';" | awk '{ print $1 }'`
注意反引号,它运行命令并返回STDOUT文本,该文本将输入“while read”行的STDIN。另外,我将shell变量名称放在括号中,这也是一种很好的做法,可以防止它们被错误地插入。
这样,你就可以避免awk为了运行mysqldump命令而执行另一个shell而且你的代码[稍微]更容易维护。作为额外的好处,您可以在调用mysqldump之前添加错误检查以确保mysql命令成功。
此外,我建议使用'cut'而不是'awk'来实现这一点,对于你想做的事情来说,它会更有效率。
仅供参考,您也可以将mysqldump的STDOUT直接发送到gzip的STDIN中,如下所示:
mysqldump -u${db_user} -p${db_pwd} ${schema_name} | gzip > ${backup_file}.gz
答案 1 :(得分:0)
这是一个好主意,但你真的没有做足够的文本解析保证awk
,你可以用bash这样做。
query = "SELECT schema_name FROM schemata WHERE schema_name LIKE 'db_prefix_%';"
mysql -NBr -u$db_user -p$db_pwd -Dinformation_schema -e $query | while read line
do
arr=($line)
mysqldump -u$db_user -p$db_pwd ${arr[0]} > $local_bckup_store/${arr[0]}.$timestamp.sql && gzip $local_bckup_store/${arr[0]}.$timestamp.sql
done
bash
将通过在空格上为您分割字符串来创建数组(这是arr=($line)
的点)。
答案 2 :(得分:0)
这个awk命令有问题:
awk '{ system("mysqldump -u$db_user -p$db_pwd $1 > $local_bckup_store/$1.$timestamp.sql | gzip" $1) }'
因为awk不能像单引号那样使用shell变量$db_user
等。要将shell变量传递给awk,请使用以下语法:
awk -v $db_user="$db_user" -vdb_pwd="$db_pwd" ts="$timestamp" '{
system("mysqldump -udb_user -pdb_pwd " $1 " > $local_bckup_store/" $1 "." ts ".sql | gzip" $1) }'
PS:你mysqldump | awk
在这里未经测试。
另一种选择是直接在shell中执行:
schema=$(mysql -NBr -u$db_user -p$db_pwd -Dinformation_schema -e "SELECT schema_name FROM schemata WHERE schema_name LIKE 'db_prefix_%';")
mysqldump -u$db_user -p$db_pwd "$schema" > "$local_bckup_store/$schema.$timestamp.sql"