awk: 날짜가 포함된 빈 줄

awk: 날짜가 포함된 빈 줄

다음 코드를 사용하여 온라인 사용자의 프로세스 번호를 작성하고 날짜를 확인합니다.

w | tail -n +3 | awk ' 
        { "date +%H:%M:%S" | getline tim}
        {if ($1 != "")
                { if (usr != $1)  {printf("%s\t%d\t%s\n",usr, num, tim);
                                usr = $1; 
                                num = 1 }
                else {num++}   
                }
        }
        END{ 
        if ($1 != "") if (num !=0) printf("%s\t%d\t%s\n",usr, num, tim);}
' > test2
echo

질문이 있습니다. 스크립트를 실행한 후 첫 번째 분석을 위해 + 줄을 제공하여 usr에는 공백을, 프로세스 번호와 날짜에는 1을 제공한 다음 실제 사용자와 콘텐츠를 제공합니다. 문제를 해결하도록 도와주실 수 있나요? 아니면 이 기능이 이미 존재하나요?

답변1

문제는 usr통합 중이고 루프를 처음 통과할 때 usr동등이 없으므로 $1해당 행을 인쇄한다는 것입니다.

BEGINawk 코드에 블록을 추가 할 수 있습니다 .

BEGIN { usr = blank }

그런 다음 내부에서 if인쇄하기 전에 해당 상태를 확인하십시오.

...
{ if (usr != $1)  {                                                                                     
    if (usr != blank) { printf("%s\t%d\t%s\n",usr, num, tim); }                              
    usr = $1;                                                                               
    num = 1 }    
...

답변2

가능한스크립트의 의도를 오해하는 것이겠지만, 각 사용자의 수를 포함하는 배열을 구성하는 것이 더 간단하지 않을까요? 그것은 마치

w | awk '
BEGIN{"date +%H:%M:%S" | getline tim}; 
NR > 2 {num[$1]++}; 
END {for (usr in num) print usr, num[usr], tim}
'

또는

w | awk -v tim="$(date +%H:%M:%S)" '
NR > 2 {num[$1]++}; 
END {for (usr in num) print usr, num[usr], tim}
'

관련 정보