awk를 사용하여 중요한 단어 뒤에 여러 단어를 어떻게 얻을 수 있나요?

awk를 사용하여 중요한 단어 뒤에 여러 단어를 어떻게 얻을 수 있나요?

다음과 같은 여러 쿼리를 실행하기 위해 데이터베이스에 한 번만 연결하고 싶습니다 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위해 참조로 전달하고 열 형식 출력에서 ​​관심 있는 데이터를 가져올 수 있습니다.echogrep

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
..

관련 정보