用awk 过滤awk系统输出?



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

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

有什么办法可以做到这一点吗?

多谢!

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

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

讨论:

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

  • awk中,模式NR>1去掉输出的第一行,其中包含表头。此行对于您希望awk生成的文件毫无用处。

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

更新(强制who时的替代

(如果必须使用who,如原始帖子的评论中所述,我会使用awkwhops的输出中删除不必要的行和列。

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

对于那些想知道$user周围的双引号是关于什么的读者:这些用于防止通配(如果$user包含星号(*((和单词拆分(如果$user包含空格(。

我将保留我原来的答案,以造福任何读者,让他们更自由地选择适合他们工作的工具。

这就是你的想法吗?

最新更新