[英]Filter awk system output with 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
。 因為我們用>>
附加而不是用>
覆蓋,所以用戶username
運行的所有 PID 最終都會在文件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
包含空格)。
我將保留我原來的答案,以讓任何讀者可以更自由地選擇適合他們工作的工具。
那是你想的嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.