awk를 사용하여 bash 스크립트에서 변수 사용

awk를 사용하여 bash 스크립트에서 변수 사용

이 awk 명령을 동적으로 호출하는 스크립트를 만들고 싶습니다.

awk '/2019.07.16 09:00/, /2019.07.16 10:00:/' mylog.log | awk '$3 == "-" && $4 != "-" {print $4}' | sort | uniq | wc -l

일반적으로 명령을 호출하면 성공하지만 이제 명령을 여러 번 실행하고 시간 범위를 변경하려고 하므로 시간을 설정하는 데 문제가 있습니다. 시도한 방법은 다음과 같습니다.

for counter in {7..7}
    do
        echo "Counter "$counter
        echo /2019.07.16 0"$counter":00/, /2019.07.16 0"$((counter+1))":00:/

        # The commented code shows unsuccessful attempts
        #awk '/2019.07.16 0"$counter":00/, /2019.07.16 "$((counter+1))":00:/' mylog.log | awk '$3 == "-" && $4 != "-" {print $4}' | sort | uniq | wc -l

        # The commented code shows unsuccessful attempts
        #startvar=0"$counter":00/,
        #echo $startvar
        #awk -v start="$startvar" '/2019.07.16 start /2019.07.16 08:00:/' mylog.log | wc -l                 
    done

어떤 팁이 있나요? 미리 감사드리며 안녕

답변1

작은 따옴표 대신 큰 따옴표를 사용하면 따옴표 사이에 변수 대체가 작동합니다. 이 접근 방식을 사용하면 스크립트의 모든 $"문자를 또는 awk로 인용해야 합니다 .\$\"

awk "/2019.07.16 0$counter:00/, /2019.07.16 0$((counter+1)):00:/" mylog.log | ...

및에 대한 솔루션 만 0$counter:00유효합니다.0$((counter+1)):00counter+1 < 10

두 자리 시간 값도 필터링하려면 시간 문자열에 printf 형식을 사용할 수 있습니다.

start=$(printf "%2.2d" "$counter")
stop=$(printf "%2.2d" "$((counter+1))")

awk "/2019.07.16 $start:00:/, /2019.07.16 $stop:00:/" mylog.log | ...

실제 입력 데이터의 각 행에 날짜와 시간이 포함되어 있고 다음 시간의 00분이 필요하지 않은 경우 패턴을 단순화할 수 있습니다.

awk "/2019.07.16 $start:/" mylog.log | ...

start=07예를 들어, 에서 까지의 모든 행이 인쇄되어야 합니다 .07:00:0007:59:59

awk이러한 단순화를 통해 두 개의 스크립트를 하나로 결합 할 수도 있습니다 .

awk "/2019.07.16 $start:/ && \$3 == \"-\" && \$4 != \"-\" {print \$4}" mylog.log | sort -u | wc -l

참고: sort -u와 동일한 출력을 제공합니다 sort | uniq.

더 나은 솔루션을 위해서는 입력 데이터의 정확한 형식을 알아야 합니다.

날짜가 열 1에 있고 시간이 열 2에 있다고 가정하면 awk스크립트 코드에서 쉘 변수 확장 없이 데이터를 변수 로 전달할 수 있습니다 awk. 이 솔루션을 사용하면 작은따옴표를 사용할 수 있으며 코드 삽입 취약점은 물론 $스크립트의 인용문이나 참조도 방지할 수 있습니다."

timepattern=$(printf "^%2.2d:" "$counter")
date="2019.07.16"

awk -v date="$date" -v timepattern="$timepattern" '$1 == date && $2 ~ timepattern && $3 == "-" && $4 != "-" {print $4}' mylog.log | sort -u | wc -l

관련 정보