Pengantar
Saya mencoba menangkap proses apa yang dimulai selama periode waktu terbatas.
Saya telah membuat skrip (ps-suspects.sh
) dimana:
- Saya menjalankan
ps-suspects.sh
dari terminal. - Saya memulai dan menutup aplikasi, misalnya Kalkulator Desktop.
- Saya tekan Ctrl +C untuk mengakhiri
ps-suspects.sh
- Saya ingin tahu apa nama proses untuk Kalkulator itu
- Saya tidak ingin mencantumkan semua nama proses lain yang menjalankan seluruh periode snapshot.
Masalahnya
Saya memiliki potongan kode yang perlu disesuaikan:
$ sort -k15 ~/pid.log | uniq -f14 -c
Inilah yang dihasilkannya:
$ 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
Saya ingin menghilangkan semua baris yang muncul 63
atau lebih.
Keluaran yang Diinginkan
$ 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
Pertanyaan
Dalam contoh ini 63
akan muncul pada 90%-99% dari baris di kolom 1 dan garis tersebut perlu dihapus. Semua kemunculan 126
juga bisa dihilangkan. Jadi apa pun yang paling banyak terjadi dan lebih hebat dapat dihapus.
Dapatkah seseorang menemukan awk
yang hilang? dan/atau uniq
dan/atau grep
untuk menyelesaikan tugas?
Jawaban yang Diterima:
Python untuk menyelamatkan:
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="")'
Alternatif, versi tidak terkompresi untuk digunakan sebagai file skrip:
#!/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="")
Satu-satunya asumsi yang dibuat skrip ini tentang inputnya, yang diharapkan disalurkan ke stdin, adalah bahwa setiap baris memiliki nomor integer yang valid di kolom pertama yang dipisahkan spasi. Garis tidak perlu diurutkan dalam bentuk apa pun.
Terkait:Algoritma hash apa yang digunakan untuk kata sandi yang disimpan dalam bayangan di 11.10?Catatan: Jika ada beberapa nomor paling umum yang berbeda di kolom pertama dengan jumlah yang sama, yang mana dari keduanya yang dipilih adalah arbitrer, tetapi harus konstan untuk input yang sama. Jika ini tidak diinginkan, Anda harus mengganti baris yang menemukan nilai paling umum dengan sesuatu seperti ini, untuk menemukan nilai paling umum tertinggi:
most_common = sorted(collections.Counter(item[0] for item in items).most_common(),
key=lambda x:x[::-1])[-1][0]
Contoh masukan:
1 foo
3 bar
2 baz
3 apple
3 banana
2 cherry
4 beep
Contoh keluaran:
1 foo
2 baz
2 cherry