おやすみなさい、
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 */;
最後に、2つの質問があります。
'blog' 'blog1' 'mysql'
残りの行をリストせずに出力されるデータベースのみをリストできますか?
後でスクリプトから呼び出すために変数として保存することもできますか?
フレディの調整出力
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
これを達成する1つの方法は、データベース名を出力する行をフィルタリングすることですsed
。
出力では、データベース名の共通点の1つは「引用符」です。
したがって、次のプロセスを使用して名前を含む行をパイプできます。
- 各引用符の後に改行文字を入れます。
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