입력이 끝나지 않을 때 awk에서 END {}를 사용하는 방법은 무엇입니까?

입력이 끝나지 않을 때 awk에서 END {}를 사용하는 방법은 무엇입니까?

tail -f ./somefile명령 에 대한 입력 과 같은 명령을 사용하고 있다고 가정해 보겠습니다 awk. awk를 사용하여 | wc -l명령 끝에서 a를 실행하는 것처럼 연속적으로 일치 항목을 합산하고 싶지만 입력은 계속 수신됩니다... AWK가 입력을 합산하면 END{}명령의 일부와 함께 표시됩니다. 여전히 입력을 받고 있으며 END{}명령의 해당 부분은 실행되지 않습니다. 그러면 명령 awk에서 입력을 계속 받으려면 어떻게 해야 합니까? 대신 코드 조각에서 사용할 tail -f ./somefile수 있는 반복 메커니즘이 있습니까 ?awkEND{}

답변1

"일치"가 정확히 어떻게 작동하는지 언급하지 않았으므로 /pattern/ {}규칙과 일치하는 줄이 개수를 증가시키는 것으로 가정합니다.

명령 끝에서 a를 실행하는 awk것과 같이 를 사용하여 지속적으로 일치 항목을 합산하고 싶습니다.| wc -l

입력이 무한대라면, 증가할 때마다 카운트를 표시하고 싶겠죠?

END {}기본적으로 이 경우에는 규칙을 사용하지 마십시오. 다음 AWK 프로그램 예제와 같이 증가시키는 카운터를 인쇄하십시오.

# Initializer
BEGIN {
    counter=0;
}

# Pattern A
/^COUNT$/ {
    ++counter;
    print counter;
}

# Pattern B
/^HERE$/ {
    ++counter;
    print counter;
}

이 프로그램은 입력에 한 줄이 나타날 때마다 계산하고 카운터 값을 표시합니다 COUNT.HERE

일치시킬 패턴이 많고 코드 중복을 최소화하려는 경우 다음을 사용할 수 있습니다.AWK 기능계산과 표시를 하나의 작업으로 결합합니다.

# Initializer
BEGIN { counter=0; }

# Count and Display Function
function count() {
    ++counter;
    print counter;
}

# Pattern A
/^COUNT$/ { count(); }

# Pattern B
/^HERE$/ { count(); }

스크린샷(위의 두 프로그램 모두 동일한 출력을 제공합니다):

관련 정보