다음과 같은 여러 쿼리를 실행하기 위해 데이터베이스에 한 번만 연결하고 싶습니다 SELECT
.
#!/bin/bash
#Begin Code
query=$(echo "SELECT COUNT(*) from USER_IPTable;
SELECT User from USER_IPTable;
SELECT IP_Address from USER_IPTable;" | mysql -u root --password='PASS' MatchingDB)
그러면 다음과 같은 내용이 반환됩니다.
COUNT(*) 3 User user1 user2 user3 IP_Address 192.168.1.17 192.168.1.24 192.168.1.17
다음과 같이 awk를 사용하여 COUNT를 성공적으로 얻었습니다.
numberOfUsers=$(echo $query| awk ' { print $2 } ')
awk
내 질문은 개수를 기준으로 단어 뒤의 각 단어와 User
개수를 기준으로 단어 뒤의 각 단어를 어떻게 얻습니까 ?IP_Address
답변1
변수 NF에는 필드 번호가 포함되어 있습니다. 변수를 사용하여 앞에 $를 추가하여 필드를 참조할 수 있습니다($i == $4, 여기서 i == 4). 그런 다음 필드를 반복하고 플래그 변수를 사용하여 각 유형의 원하는 값에 도달한 시기를 확인합니다.
<your command> | awk '{for (i=1; i<=NF; i++) {if ($i == "User") {type="user"} else if ($i == "IP_Address") {type="ip"} else if(type == "user") { print "user value = " $i} else if (type == "ip") { print "ip value = " $i}}}'
답변2
나는 다음과 같은 것을 시도할 것입니다:
for i in `seq 1 $numberOfUsers`;
do
#Will print users
echo $query | awk ' { print `expr $i + 2` } '
#Will print ip
echo $query | awk ' { print `expr $i + $numberOfUsers + 3` } '
done
답변3
쿼리를 사용하고 결과를 csv 형식으로 얻는 것이 더 명확합니다.
SELECT count(*), User, IP_Address from USER_IPTable;
그런 다음 awk를 사용하여 결과를 한 줄씩 구문 분석하고 사용자 및 IP 배열을 채우거나 필요한 모든 작업을 직접 데이터를 처리할 수 있습니다.
답변4
사용자와 IP 주소를 나열하는 것이 목적이고 MYSQL이 출력 레코드당 하나의 행을 반환한다고 가정하는 경우 토큰화에서 줄 바꿈이 누락되는 것을 방지하기 $query
위해 참조로 전달하고 열 형식 출력에서 관심 있는 데이터를 가져올 수 있습니다.echo
grep
echo "$query" | grep -v -x -e 'COUNT(\*)' -e 'User' -e 'IP_Address' |
tail -n +2
user1
user2
..
192.1.1.1
192.3.4.5
..