sh 스크립트에서 grep 출력 조정

sh 스크립트에서 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'나머지 줄을 나열하지 않고 출력되는 데이터베이스만 나열할 수 있습니까 ?

나중에 스크립트에서 호출할 수 있도록 변수로 저장할 수도 있나요?

프레디의 조정된 출력

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.

출력에서 데이터베이스 이름의 공통점 중 하나는 "`" 따옴표입니다.

따라서 다음 프로세스를 통해 이름이 포함된 라인을 파이프할 수 있습니다.

  1. 각 따옴표 뒤에 개행 문자를 넣습니다.
  2. Grep참조가 포함된 모든 라인에 대해
  3. 모든 줄 바꿈을 공백으로 바꾸십시오.
  4. 각 이름의 여는 따옴표 뒤의 공백이라고 생각되는 것을 제거하십시오.

그러면 해당 줄에 따옴표 안의 이름만 출력됩니다.

제가 이 답변을 오전 1시 이후에 게시했다는 점을 명심하세요. 제가 스크립트를 올바르게 읽었고 제가 바보가 아니라면 다음과 같이 보일 것입니다.

echo $sqldbs | sed 's/\`/\`\n/' | grep "\`" | sed 's/\n/ /' | sed 's/\` /`/'

조금 시간이 걸리겠지만 작업을 완료해야 합니다.

질문이 있으시면 알려주시기 바랍니다.

답변2

이 답변의 가정:

  • *.sql파일 시스템에 0개 이상의 파일이 존재할 수 있습니다.
  • 데이터베이스 이름을 배열에 저장하는 데 사용하는 Bash 호출을 허용합니다.
  • grepPerl 호환 정규 표현식( )을 사용하면 일치 항목에서 원하지 않는 부분( )의 출력을 -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

관련 정보