我需要使用 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
,如原始帖子的评论中所述,我会使用awk
从who
和ps
的输出中删除不必要的行和列。
for user in $(who | awk 'NR>1 {print $1}')
do
ps -u "$user" | awk 'NR>1' > "$user".txt
done
对于那些想知道$user
周围的双引号是关于什么的读者:这些用于防止通配(如果$user
包含星号(*
((和单词拆分(如果$user
包含空格(。
我将保留我原来的答案,以造福任何读者,让他们更自由地选择适合他们工作的工具。
这就是你的想法吗?