좋은 저녁이에요,
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'
나머지 줄을 나열하지 않고 출력되는 데이터베이스만 나열할 수 있습니까 ?
나중에 스크립트에서 호출할 수 있도록 변수로 저장할 수도 있나요?
프레디의 조정된 출력
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
파일 시스템에 0개 이상의 파일이 존재할 수 있습니다.- 데이터베이스 이름을 배열에 저장하는 데 사용하는 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