はじめに
限られた期間にどのプロセスが開始されたかを把握しようとしています。
スクリプトを作成しました(ps-suspects.sh
)ここで:
-
ps-suspects.sh
を実行します ターミナルから。 - アプリケーション、たとえばデスクトップ電卓を起動して閉じます。
- Ctrlを押します + C
ps-suspects.sh
を終了します - 電卓のプロセス名を知りたい
- スナップショットの全期間を実行している他のすべてのプロセス名を一覧表示したくありません。
問題
微調整が必要なコードスニペットがあります:
$ sort -k15 ~/pid.log | uniq -f14 -c
生成されるものは次のとおりです。
$ head ~/pid.tmp
1 /mnt/e/bin/ps-suspects.sh Possible suspects causing problems
63 1 S root 127 2 0 60 -20 - 0 - Sep08 ? 00:00:00 [acpi_thermal_pm]
63 1 S root 75 2 0 60 -20 - 0 - Sep08 ? 00:00:00 [ata_sff]
63 1 S root 447 2 0 60 -20 - 0 - Sep08 ? 00:00:00 [ath10k_aux_wq]
63 1 S root 446 2 0 60 -20 - 0 - Sep08 ? 00:00:00 [ath10k_wq]
63 1 S avahi 922 910 0 80 0 - 11195 - Sep08 ? 00:00:00 avahi-daemon: chroot helper
63 4 S avahi 910 1 0 80 0 - 11228 - Sep08 ? 00:00:00 avahi-daemon: running [alien.local]
126 0 S rick 2902 2867 0 80 0 - 7409 wait_w Sep08 pts/18 00:00:00 bash
63 0 S rick 25894 5775 0 80 0 - 4908 wait 10:43 pts/2 00:00:00 /bin/bash /mnt/e/bin/ps-suspects.sh
63 0 S root 980 976 0 80 0 - 4921 - Sep08 ? 00:00:01 /bin/bash /usr/local/bin/display-auto-brightness
63
で発生するすべての行を削除したい 以上。
必要な出力
$ ps-suspects.sh
20 times / second ps -elf is captured to /home/rick/pid.log
Type Ctrl+C when done capturing
~/pid.log is sorted and uniq counted on column 15
which is full path and program name.
Then all matches with same unique count (the headings)
are stripped and only new processes started are printed.
This function can help you trace down what processes are
causing you grief for lid close events, hot plugging, etc.
^C
wc of ~/pid.log : 17288 343162 2717102 /home/rick/pid.log
HighCnt: 63
1 /mnt/e/bin/ps-suspects.sh Possible suspects causing problems
26 0 R rick 25976 2051 0 80 0 - 120676 - 10:43 ? 00:00:00 gnome-calculator
62 0 S root 22561 980 0 80 0 - 3589 - 10:42 ? 00:00:00 sleep 60
質問
この例では、63
列1の行の90%〜99%に表示され、それらの行を削除する必要があります。 126
のすべての出現 削除することもできます。つまり、最も発生しやすく、より優れたものは何でも 削除できます。
誰かが不足しているawk
を思い付くことができますか? および/またはuniq
および/またはgrep
タスクを完了するには?
承認された回答:
Pythonが救いの手を差し伸べます:
python3 -c 'import sys,collections;l=[(int(L.split(None,1)[0]),L)for L in sys.stdin.readlines()];m=collections.Counter(x[0]for x in l).most_common(1)[0][0];print(*[x[1]for x in l if x[0]<m],sep="",end="")'
スクリプトファイルとして使用するための代替の非圧縮バージョン:
#!/usr/bin/env python3
import sys
import collections
# read lines from stdin (with trailing \n) and extract the number in their first column
items = [(int(line.split(None, 1)[0]), line) for line in sys.stdin]
# find the most common number from the first column
most_common = collections.Counter(item[0] for item in items).most_common()[0][0]
# print input lines in order, but only those with their number lower than the most common
print(*[item[1] for item in items if item[0] < most_common], sep="", end="")
このスクリプトが入力について行う唯一の仮定は、stdinにパイプされることが期待されており、各行の最初の空白で区切られた列に有効な整数があるということです。行をどのような形式でも並べ替える必要はありません。
関連:11.10でシャドウに保存されたパスワードに使用されるハッシュアルゴリズムは何ですか?注: 同じカウントの最初の列に複数の異なる最も一般的な番号がある場合、これら2つのうちどちらが選択されるかは任意ですが、同じ入力に対して一定である必要があります。これが望ましくない場合は、最も一般的な値を見つける行を代わりに次のようなものに置き換えて、最も一般的な値を見つける必要があります。
most_common = sorted(collections.Counter(item[0] for item in items).most_common(),
key=lambda x:x[::-1])[-1][0]
入力例:
1 foo
3 bar
2 baz
3 apple
3 banana
2 cherry
4 beep
出力例:
1 foo
2 baz
2 cherry
Ubuntu Server 20.04.1 Lts、インストール中にすべてのディスクスペースが割り当てられたわけではありませんか?
Ubuntu 14.10複数の同時独立リモート(デスクトップのような)接続?