![awk를 사용하여 bash 스크립트에서 변수 사용](https://linux55.com/image/157297/awk%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20%EB%B3%80%EC%88%98%20%EC%82%AC%EC%9A%A9.png)
이 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)):00
counter+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:00
07: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