簡體   English   中英

用awk過濾awk系統輸出?

[英]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是強制性的,如對原始帖子的評論中所述,我將使用awkwhops的輸出中去除不必要的行和列。

 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM