내 쿼리는 다음과 같습니다
QUERY="SELECT 'Your Name:', FullName, 'Your Phone:', Phone, 'Email:', Email FROM Table1 JOIN WHERE EmpID=001;"
내가 얻는 결과는 다음과 같습니다.
Your Name: Samanta Your Phone: 111-111-1111 Email: [email protected]
하지만 인쇄할 때 다음과 같은 출력을 원합니다.
Your Name: Samanta
Your Phone: 111-111-1111
Email: [email protected]
나는 이것을 시도했습니다 :
출력 =executeSQLQuery "$QUERY" | tr -c ' ' '\n'
작동하지 않습니다.
답변1
output=executeSQLQuery "$QUERY" |sed 's/: [^ ]* /& \n/g'
위의 명령은 다음을 생성합니다.
user@user:~> z="Your Name: Samanta Your Phone: 111-111-1111 Email: [email protected]"
user@user:~> echo $z | sed 's/: [^ ]* /& \n/g'
Your Name: Samanta
Your Phone: 111-111-1111
Email: [email protected]
user@user:~>
이 명령은 콜론(':'), 공백, 공백이 아닌 모든 문자로 구성된 정규식 일치를 사용합니다. 그러나 데이터에 공백 문자가 포함되어 있으면 명령이 제대로 실패합니다.
답변2
이것은 다음과 같습니다XY 문제- 두 단어 사이에 구분 기호를 추가하고 싶다고 말했지만 실제로 원하는 것은 SQL 쿼리에서 반환된 데이터를 인쇄하는 것입니다.
귀하의 문제는 단순한 데이터가 아닌 형식화된 출력을 반환하는 ExecutionSQLQuery 함수(또는 스크립트 또는 프로그램)로 인해 발생하며 $QUERY 문자열이 이를 지시하기 때문에 그렇게 하는 것처럼 보입니다.
executeSQLQuery
열 헤더 없이 구문 분석하기 쉬운 형식(예: CSV 또는 탭으로 구분)으로 데이터를 반환하는 함수/스크립트가 있습니까 ?
(즉, "그럼 하지 마세요." 데이터 수집과 결과의 분리 제시)
가능하다면 printf를 사용하여 원하는 방식으로 데이터 형식을 지정할 수 있습니다. 예를 들어 탭으로 구분된 출력과 bash 배열을 사용하면 다음과 같습니다.
QUERY="SELECT FullName, Phone, Email FROM Table1 WHERE EmpID=001;"
# disable globbing which would otherwise be performed upon non-quoted
# command substitution (except in zsh):
set -f
# set the input-field-separator to tab and newline (but not space characters)
# execute the query and store the results in the array $output
IFS=$'\t\n' output=($(executeSQLQuery "$QUERY"))
# now print the output array in the format we want.
printf "Your Name: %s\nYour Phone: %s\nEmail: %s\n" "${output[@]}"
다음은 mysql을 사용한 실제 예제입니다. 나는 당신이 무엇인지 모르지만 executeSQLQuery
방금 테스트 mysql 데이터베이스("정크"라고 함)를 만들고 여기에 예제 데이터를 채우고 executeSQLQuery
다음과 같은 함수를 정의했습니다.
$ executeSQLQuery() { mysql --batch --silent junk -e "$@" ;}
--batch
주의사항 및 옵션을 참고해주세요 --silent
. 그들은 mysql에게 헤더나 다른 형식 없이 데이터만 제공하라고 지시합니다. 내 자격 증명이 포함된 ~/.my.cnf 파일을 생성했기 때문에 사용자 -u
및 비밀번호 옵션이 없습니다.-p
이제 쿼리를 실행하고 출력 배열에 포함된 내용을 표시한 다음 printf를 사용하여 예쁘게 인쇄해 보겠습니다.
$ set -f; IFS=$'\t\n' output=($(executeSQLQuery 'Select Fullname,Phone, Email from Table1 where EmpId = 001'))
$ set | grep output
output=([0]="Samantha" [1]="111-111-1111" [2]="[email protected]")
$ printf "Your Name: %s\nYour Phone: %s\nEmail: %s\n" "${output[@]}"
Your Name: Samantha
Your Phone: 111-111-1111
Email: [email protected]
그런데 bash는 다차원 배열을 지원하지 않으므로 쿼리가 여러 행을 반환하는 경우 [0..2], [3..5], [6.. 8] 등을 별도의 기록으로 한다. 예를 들어, 테이블 1에 두 번째 레코드를 추가하고 모든 행을 반환하도록 쿼리를 변경했습니다. 이제 출력 배열은 다음과 같습니다.
$ set -f; IFS=$'\t\n' output=($(executeSQLQuery 'Select Fullname,Phone, Email from Table1'))
$ set | grep output
output=([0]="Samantha" [1]="111-111-1111" [2]="[email protected]" [3]="Fred" [4]="222-222-2222" [5]="[email protected]")
하지만 전체적으로는 이렇습니다많은DBI 라이브러리를 사용하면 Perl에서 데이터베이스 작업을 더 쉽게 수행할 수 있습니다. 어떤 이유로 bash를 사용하지 않으려면 Perl을 배우기 시작하는 것이 좋습니다.
답변3
출력의 문제는 출력의 첫 번째 줄에 세 단어(논리적으로 키-값 쌍임에도 불구하고)를 그룹화하고, 다음 줄에 또 다른 세 단어를, 세 번째 줄에 마지막 두 단어를 그룹화하려는 것입니다.
이 특정 문제의 경우 빠른 방법은 다음과 같습니다.
executeSQLQuery "$QUERY" | awk '{print $1 " " $2 " " $3 "\n" $4 " " $5 " " $6 "\n" $7 " "$8 }'
그러나 일반적으로 쿼리를 다음과 같이 변경하는 것이 더 좋습니다.
SELECT FullName as 'Your name', Phone as 'Your phone', Email FROM Table1 WHERE EmpID=001;
그런 다음 행 및 열 이름을 가져오고 Perl 또는 다른 언어로 원하는 출력을 만듭니다.