34

'ps'からPID、UID、コマンドフィールドを抽出する必要があり、次のように試しました。

ps -L u n | cut -f 1,2,13

何らかの理由で、これはカットコマンドがまったくないために動作します。通常のps出力を返すだけです。それでは、やってみました

ps -L u n | tr -s " " | cut -d " " -f 1,2,13そしてこれは全くナンセンスを返します。それから、私はそれとこれで遊んでみました:

ps -L u n | tr -s " " | cut -d " " -f 2,3,14

そして、これはどういうわけか私が必要とするものを返します(ほとんど、そしてそれがほとんど機能する理由はわかりません)、それがその真ん中のコマンドフィールドを切り取る以外は。どうすれば必要なものを手に入れることができますか?

4

4 に答える 4

56

psスペースセパレータを印刷していますが、タブ文字は使用していcutません。-dスペースを一緒にtr -s絞って、必要な間隔を確保しますが、最初のスペースのセット(1に絞られている)があるため、各フィールドに1を追加する必要があることに注意してください。また、各単語のコマンドにはスペースがあります。これは機能するはずです:

ps -L u n | tr -s " " | cut -d " " -f 2,3,14-
于 2013-03-26T17:44:35.717 に答える
15

カットを使用する特別な理由はありますか?

私はこれがあなたが望むことをするだろうと思います:

ps -eopid,uid,cmd
于 2013-03-26T17:43:56.813 に答える
15

次のように、awkを使用してコマンドをクリーンアップできます。

ps -L u n | awk '{ print $1,$2,$13 }'
于 2013-03-26T18:12:41.360 に答える
-1

問題は、リストを作成したらどうするかです。私はcutkludgyを見つけたので、 cutの代わりにリストをwhile読み取りループに渡します。「読み取り中」は行の空白以外の値を認識するため、この例では、「a」が最初の値、「b」が2番目の値、「c」が行の残りの値です。最初の2つの値、プロセス所有者とプロセスIDにのみ関心があります。そして、私は基本的に「if」を使用するのではなく、caseステートメントを乱用します。(grepでフィルター処理されたとしても、所有者名が行の他の場所に埋め込まれている可能性のあるプロセスを強制終了したくありません)

ps -ef | grep owner | grep -v grep | while read a b c; 
do 
 case $a in 
  "owner")
     kill -9 $b  
   ;; 
 esac; 
done
于 2018-12-13T23:01:37.780 に答える