![awk:带日期的空行](https://linux22.com/image/39911/awk%EF%BC%9A%E5%B8%A6%E6%97%A5%E6%9C%9F%E7%9A%84%E7%A9%BA%E8%A1%8C.png)
我使用以下代码写入在线用户的进程号和检查日期:
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
不 equal $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}
'