晚上好,
我正在尝试 grep 存储在 MYSQL 转储中的数据库列表,但我想调整一些设置 - 我不确定如何执行此操作。
目前的代码是;
#!/bin/sh
echo "What is the cPanel username!"
read cpuser
cd /home/${cpuser}/public_html
sqldump=$(find . -name \*.sql -type f)
sqlversion=$(grep "Server version" ${sqldump})
sqldbs=$(grep "CREATE DATABASE" ${sqldump})
echo "The dump location is"
echo $sqldump
echo "The SQL version is"
echo $sqlversion
echo "The databases in the dump are"
echo $sqldbs
其输出是(在本例中)
What is the cPanel username!
domain1mysql4
The dump location is
./test/xxx/database/xxxx.sql
The SQL version is
-- Server version 4.1.14
The databases in the dump are
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `blog` /*!40100 DEFAULT CHARACTER SET latin1 */; CREATE DATABASE /*!32312 IF NOT EXISTS*/ `blog1` /*!40100 DEFAULT CHARACTER SET latin1 */; CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysql` /*!40100 DEFAULT CHARACTER SET latin1 */;
最后我有两个问题。
是否可以只列出它输出的数据库'blog' 'blog1' 'mysql'
而不列出该行的其余部分?
是否也可以将它们保存为变量以便稍后在脚本中调用?
Freddy调整后的输出
sh ./test.sh
enter the cPanel username: domain10mysql4
./home/saiprem/xxxxx/database/xxxx.sql:activesearch
./home/saiprem/xxxxx/database/x.sqxxxxl:alienstats
./home/saiprem/x/database/xxxxxx.sql:anahaw
xxxx./home/saiprem/x/databasxxxe/xxxx.sql:b2
./home/saiprem/x/database/x.sql:beeforumxxx
答案1
实现此目的的一种方法是通过 过滤输出数据库名称的行sed
。
数据库名称在输出中的共同点之一是“`”引号。
因此,您可以通过以下过程管道包含名称的行:
- 在每个引用后面放置一个换行符
Grep
对于包含引用的所有行- 将所有换行符替换为空格
- 删除我认为每个名称的开头引号后面的空格。
这应该只输出该行引号内的名称。
请记住,我是在凌晨 1 点之后发布这个答案的,如果我没看错你的脚本,而且我没犯傻的话,它应该是这样的:
echo $sqldbs | sed 's/\`/\`\n/' | grep "\`" | sed 's/\n/ /' | sed 's/\` /`/'
虽然有点啰嗦,但应该可以完成工作。
如果有任何问题,请告诉我。
答案2
这个答案的假设:
*.sql
文件系统中可能存在零个或多个文件- 允许调用 Bash,我们使用它将数据库名称存储在数组中
grep
使用与 Perl 兼容的正则表达式 (-P
) 可用于不输出匹配 (\K
) 中不需要的部分。
#!/bin/sh
read -p "enter the cPanel username: " cpuser
cd "/home/$cpuser/public_html"
find . -name \*.sql -type f -exec bash -c '
echo "found $# sql dumps"
for file; do
version=$(grep -Poe "-- Server version \K.*" "$file")
dbnames=( $(grep -Poe "CREATE DATABASE [^\`]*\`\K[^\`]*" "$file") )
printf "\n file: %s\n" "$file"
printf "server version: %s\n" "$version"
printf "%2s database(s): %s\n" "${#dbnames[*]}" "${dbnames[*]}"
for dbname in "${dbnames[@]}"; do
echo "do something with $dbname"
done
done
' 'find-sh' {} +
使用两个测试文件的输出:
$ ./script.sh
enter the cPanel username: me
./script.sh: 4: cd: can't cd to /home/me/public_html
found 2 sql dumps
file: ./dump2.sql
server version: 4.1.14
1 database(s): test
do something with test
file: ./dump1.sql
server version: 4.1.14
3 database(s): blog blog1 mysql
do something with blog
do something with blog1
do something with mysql
您可以看到该目录/home/me/public_html
不存在,并且脚本需要错误处理。
编辑:
所有带有文件名前缀的数据库名称:
$ find . -name \*.sql -type f -exec grep -Poe "CREATE DATABASE [^\`]*\`\K[^\`]*" {} +
./dump2.sql:test
./dump1.sql:blog
./dump1.sql:blog1
./dump1.sql:mysql
所有数据库名称已排序(添加-u
到排序以删除重复项):
$ find . -name \*.sql -type f -exec grep -hPoe "CREATE DATABASE [^\`]*\`\K[^\`]*" {} + | sort
blog
blog1
mysql
test