다음 코드를 사용하여 온라인 사용자의 프로세스 번호를 작성하고 날짜를 확인합니다.
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
해당 행을 인쇄한다는 것입니다.
BEGIN
awk 코드에 블록을 추가 할 수 있습니다 .
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}
'