Cara mengekstrak pasangan nilai kunci dari perintah ps

10

Saya mencoba mengekstrak nama aplikasi dari psperintah seperti ini:

ps -af -u sas |grep "java"| grep -v "grep"

dan itu menghasilkan sebagai berikut:

sas 24431     1  0 Oct10 ?        00:51:08 /usr/lib/jvm/java-1.7.0-oracle-1.7.0.25.x86_64/jre/bin/java -Denv=DEV -Dapp.name=myApp -Xms512m -Xmx1g -Dlog.dir=/apps/java/logs

Saya mencoba menggunakan egreptetapi tampaknya tidak berfungsi:

ps -af -u sas|grep "java"| grep -v "grep"| egrep -o "-Dapp.name"

Bagaimana saya bisa mendapatkan -Dapp.namenilai "myApp" saja?

Sas
sumber
jika greppola dimulai dengan -, Anda harus meletakkannya setelah -eopsi. Kalau tidak, itu akan diperlakukan sebagai opsi. Tapi itu hanya akan cocok dengan kata -Dapp.name, bukan bagian setelahnya.
Barmar
secara bergantian:grep -o -- -Dapp.name
strugee
Anda dapat menggunakan grep [j]avauntuk menghindari perintah grep -v "grep"(diuji pada bash)
HVNSweeting

Jawaban:

7

Dengan awk:

ps -af -u sas | awk 'BEGIN {RS=" "}; /-Dapp.name/'
jasonwryan
sumber
8

Anda tidak menunjukkan pesan kesalahan yang Anda peroleh tetapi itu mungkin

grep: metode perangkat yang tidak dikenal

Itu karena, seperti semua atau setidaknya sebagian besar program baris perintah lainnya, grepmengasumsikan bahwa apa pun yang dimulai dengan a -adalah opsi dan mencoba menguraikannya seperti itu. Dalam hal ini, -Ddigunakan untuk menginstruksikan grepcara menangani file perangkat (lihat man grepdetailnya). Salah satu cara untuk mengatasi ini adalah dengan menggunakan --yang memberitahu grepbahwa apa pun yang mengikuti bukan merupakan flag opsi.

Menggabungkannya dengan kemampuan PCRE dari GNU grep, Anda dapat melakukan:

ps -af -u sas | grep -v grep | grep -Po -- '*-\KDapp.name=[^\s]+'

Ekspresi reguler mencari -dan membuangnya ( \K), kemudian string Dapp.name=diikuti oleh sebanyak mungkin karakter non-spasi. Outputnya adalah:

Dapp.name=myApp

Jika Anda ingin myAppbagian disimpan dalam variabel, saya akan mencari sendiri:

ps -af -u sas | grep -v grep | grep -Po -- '-Dapp.name=\K[^\s]+'

Untuk menetapkannya ke variabel:

$ app="$(ps -af -u sas | grep -v grep | grep -Po -- '-Dapp.name=\K[^\s]+')"
$ echo $app
myApp

Namun, Anda seharusnya tidak pernah grepoutput psuntuk hal semacam ini, itu pgrepuntuk:

app="$(pgrep -a java | grep -Po -- '^Dapp.name=\K[^\s]+')"
terdon
sumber
4
ps -af -u sas | sed -n '/[j]ava/s/.*-Dapp\.name=\([^ ]*\).*/\1/p'
Barmar
sumber
3

Setiap kali Anda menggunakan ps … | grep …dan perlu mengecualikan grep dari hasil, Anda salah melakukannya.

Aturan nol untuk mengurai output psadalah menggunakan alat yang lebih andal seperti pgrepjika tersedia. Jika Anda memiliki pgrep, maka pgrep -f javadaftarkan semua proses yang menjalankan perintah java. Opsi ini -lmenambahkan baris perintah untuk setiap proses.

Untuk mengekstrak argumen -Dapp.name, Anda dapat menggunakan sed. Cocokkan seluruh baris, atur untuk mengisi bagian yang menarik dalam grup, dan cetak grup itu.

pgrep -lf java | sed -n 's/^.*-Dapp\.name=\([^ ]*\).*$/\1/p'

Aturan pertama parsing output psadalah menggunakan opsi -ountuk memilih bidang yang Anda butuhkan. Di sini, Anda hanya tertarik pada argumen perintah, jadi cetak saja.

ps -e -o args= | sed -n 's/^.*-Dapp\.name=\([^ ]*\).*$/\1/p'
Gilles 'SANGAT berhenti menjadi jahat'
sumber
3

Lebih rumit daripada jawaban lain, tetapi ini digunakan getoptuntuk menangani penguraian untuk Anda. Alternatif lain.

getopt -aql 'Dapp.name:' $(\
    ps -af -u sas | grep java | grep -v grep | tr -s ' ' | cut -d' ' -f8-\
) | cut -d"'" -f2
  1. perintahmu: ps -af -u sas | grep java | grep -v grep
  2. tr -s ' ' "memeras" beberapa ruang menjadi satu ruang untuk persiapan cut
  3. cut -d' ' -f8- membagi garis dengan spasi dan meraih semua bidang setelah 8 inklusif, hasilnya adalah /usr/lib/jvm/java-1.7.0-oracle-1.7.0.25.x86_64/jre/bin/java -Denv=DEV -Dapp.name=myApp -Xms512m -Xmx1g -Dlog.dir=/apps/java/logs
  4. getopts -aql 'Dapp.name:' $(...)mem-parsing opsi perintah dan hanya menghasilkan nama panjang yang cocok dengan Dapp.nameyang memiliki nilai (dilambangkan oleh :), hasilnya adalah--Dapp.name 'myApp' --
  5. cut -d"'" -f2 meraih barang-barang di kutipan tunggal
  6. Hasilnya adalah: myApp
kacang zam
sumber
0

Saya akan menggunakan pgrepbukannya psseperti itu:

$ pgrep -fa java | grep -op "(<=-Dapp.name=)\w+"

Ini akan mengembalikan semua proses yang cocok javadan kemudian menyaring yang menampilkan hanya yang mengandung -Dapp.name=. Bit terakhir, \w+akan menampilkan nama program, dengan asumsi tidak mengandung spasi.

CATATAN: The -Pberalih ke grepenlists kemampuan untuk menentukan hal-hal menggunakan PCRE - Perl Regular Expressions Kompatibel . Tidak semua versi grepmendukungnya, tetapi sebagian besar melakukannya dengan versi Linux yang lebih modern.

Jika Anda ingin seluruh output kunci / nilai kemudian ubah hal-hal seperti:

$ pgrep -fa java | grep -oP -- "-Dapp.name=\w+"
slm
sumber