用awk过滤awk系统输出?

Filter awk system output with awk?

我需要使用 awk 来查看哪些用户登录了计算机,用他们的名字创建一个文件,并在该文件中打印他们 运行 进程的 pid。我用过这个,但它不起作用:

who | awk '{for(i = 0; i < NR; i++)
    system("ps -u "  "| tail +2 | awk '{print }' >" ".log")
}'

有什么办法吗?

非常感谢!

为了实现使用 awk 创建这些文件的目标,我将从 ps 而不是 who 开始。这样,ps 会做更多的工作,而 awk 可以做的更少。这是一个可能对您有用的示例。 (显然没有保证!)

ps aux | awk 'NR>1 {system("echo "  " >> "  ".txt")}'

讨论:

  • 命令ps aux打印一个table描述每个活动进程,一次一行。每行的第一列包含进程用户的名称,第二列包含其 PID。该行还包含许多其他信息,您可以在改进脚本时使用这些信息。这就是您输入 awk 的内容。 (所有这些对于 Linux 和 BSD 都是正确的。在 Cygwin 中,格式不同。)

  • awk 中,模式 NR>1 去掉了输出的第一行,其中包含 table headers。此行对于您希望 awk 生成的文件没有用。

  • 对于ps aux输出中的所有其他行,awk将当前进程的PID(即</code>)添加到文件<code>username.txt,对 username 使用 </code>。因为我们附加 <code>>> 而不是用 > 覆盖,所以用户 username 的所有 PID 运行 最终都被列出,一次一行,在文件 username.txt.

更新(who 时的替代方法)

如果使用 who 是强制性的,如对原始 post 的评论中所述,我将使用 awk 从 [=14] 的输出中删除不需要的行和列=] 和 ps.

 for user in $(who | awk 'NR>1 {print }')
 do
     ps -u "$user" | awk 'NR>1' > "$user".txt
done

对于想知道 $user 周围的 double-quotes 是什么意思的读者:这些用于防止通配(如果 $user 包含星号 (*))和单词拆分(如果 $user 包含空格)。

为了读者可以更自由地选择适合他们工作的工具,我将保留我原来的答案。

这是你的想法吗?