AWK를 사용하여 셸에서 변수 정의

AWK를 사용하여 셸에서 변수 정의

라이브 MQTT 스트림을 필터링하여 CSV 파일에 덤프했습니다. CSV 파일의 네 번째 매개변수( $4)와 다섯 번째 매개변수( )를 이용하여 $5내가 원하는 정보를 찾아봅니다. 나는 이 정보를 awk(예: $machine_ID$machine_number)에 제공하여 내가 정의한 매개변수로 최신 데이터를 찾습니다. 코드는 다음과 같습니다.

engine_hours=`awk -F, -v MID="$machine_ID" -v MNR="$machine_number" '( $4 == MID ) && ( $5 == MNR ) && ( $7 == "status" ) {t=$10} END{print int(t/60)}' /home/ed/start_up_job/jacon_mqtt.csv`

engine_hours$machine_ID및 에 해당하는 테이블을 업데이트하기 위해 MySQL을 통해 전송됩니다 $machine_number. 따라서 기본적으로 언제 어떤 컴퓨터를 업데이트할지 선택합니다.

이제 및 해당 값을 $5각각 or 및 or 에 전달하고 싶습니다 . 변수를 만들기 위해 이들을 연결하겠습니다 .$4MNR$machine_numberMID$machine_ID$machine_name

따라서 코드는 다음과 같아야 합니다.

engine_hours=`awk -F, '( MID = $4 ) && ( MNR = $5 ) && ( $7 == "status" ) -v "$machine_ID"=MID -v "$machine_number"=MNR  {t=$10} END{print int(t/60)}' /home/ed/start_up_job/jacon_mqtt.csv`

내가 얻는 오류는 다음과 같습니다.awk: line 1: syntax error at or near =

이 문제를 어떻게 해결할 수 있나요?

답변1

일반적으로 awk로 계산되거나 추출된 변수를 셸에 전달하려면 다음 인코딩 패턴을 따라야 합니다.

shell_var=$( awk '{ ...some processing... ; print awk_var }' )

변수가 여러 개인 경우 할 수 있습니다.

eval "$( awk '{ ...some processing... ; print "shell_var1="awk_var1, "shell_var2="awk_var2 }' )"

코드 설명: 쉘 모드는 var=$( awk '...' )awk 프로세스가 인쇄하는 모든 것을 쉘 변수에 할당합니다. 하나의 값만 할당할 수 있으므로 이는 두 개 이상의 변수를 할당하는 데 다른 접근 방식이 필요함을 의미합니다. 한 가지 방법은 awk가 전체 작업을 인쇄하도록 하는 것입니다. 예를 들어 awk '{ print "varname=" value }'쉘 구성은 $( ... )awk 호출의 출력(이 경우 할당)을 포함하도록 다시 확장됩니다. 확장 할당 셸 명령을 활성화하려면 이를 수행 eval하는 명령인 셸 지시문이 필요합니다. 첫 번째(간단한) 경우와의 차이점은 awk에 eval여러 작업을 한 번에 인쇄하도록 지시할 수 있다는 것입니다(공백으로 구분).

입력 및 출력 변수와 몇 가지 계산이 포함된 예를 들어 보겠습니다.

number=42
square=$( awk -v NUM="$number" 'BEGIN{ print NUM*NUM }' )
echo "$square"

이것이 양방향으로 전달된 매개변수를 명확하게 해주기를 바랍니다.

관련 정보