次のコードを使用してオンラインユーザーのプロセス番号を作成し、日付を確認します。
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}
'