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不 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}
'

相关内容