Saya mencoba mengekstrak nama aplikasi dari ps
perintah 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 egrep
tetapi tampaknya tidak berfungsi:
ps -af -u sas|grep "java"| grep -v "grep"| egrep -o "-Dapp.name"
Bagaimana saya bisa mendapatkan -Dapp.name
nilai "myApp" saja?
grep
pola dimulai dengan-
, Anda harus meletakkannya setelah-e
opsi. Kalau tidak, itu akan diperlakukan sebagai opsi. Tapi itu hanya akan cocok dengan kata-Dapp.name
, bukan bagian setelahnya.grep -o -- -Dapp.name
grep [j]ava
untuk menghindari perintahgrep -v "grep"
(diuji pada bash)Jawaban:
Dengan
awk
:sumber
Anda tidak menunjukkan pesan kesalahan yang Anda peroleh tetapi itu mungkin
Itu karena, seperti semua atau setidaknya sebagian besar program baris perintah lainnya,
grep
mengasumsikan bahwa apa pun yang dimulai dengan a-
adalah opsi dan mencoba menguraikannya seperti itu. Dalam hal ini,-D
digunakan untuk menginstruksikangrep
cara menangani file perangkat (lihatman grep
detailnya). Salah satu cara untuk mengatasi ini adalah dengan menggunakan--
yang memberitahugrep
bahwa apa pun yang mengikuti bukan merupakan flag opsi.Menggabungkannya dengan kemampuan PCRE dari GNU
grep
, Anda dapat melakukan:Ekspresi reguler mencari
-
dan membuangnya (\K
), kemudian stringDapp.name=
diikuti oleh sebanyak mungkin karakter non-spasi. Outputnya adalah:Jika Anda ingin
myApp
bagian disimpan dalam variabel, saya akan mencari sendiri:Untuk menetapkannya ke variabel:
Namun, Anda seharusnya tidak pernah
grep
outputps
untuk hal semacam ini, itupgrep
untuk:sumber
sumber
Setiap kali Anda menggunakan
ps … | grep …
dan perlu mengecualikan grep dari hasil, Anda salah melakukannya.Aturan nol untuk mengurai output
ps
adalah menggunakan alat yang lebih andal sepertipgrep
jika tersedia. Jika Anda memiliki pgrep, makapgrep -f java
daftarkan semua proses yang menjalankan perintahjava
. Opsi ini-l
menambahkan 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.Aturan pertama parsing output
ps
adalah menggunakan opsi-o
untuk memilih bidang yang Anda butuhkan. Di sini, Anda hanya tertarik pada argumen perintah, jadi cetak saja.sumber
Lebih rumit daripada jawaban lain, tetapi ini digunakan
getopt
untuk menangani penguraian untuk Anda. Alternatif lain.ps -af -u sas | grep java | grep -v grep
tr -s ' '
"memeras" beberapa ruang menjadi satu ruang untuk persiapancut
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
getopts -aql 'Dapp.name:' $(...)
mem-parsing opsi perintah dan hanya menghasilkan nama panjang yang cocok denganDapp.name
yang memiliki nilai (dilambangkan oleh:
), hasilnya adalah--Dapp.name 'myApp' --
cut -d"'" -f2
meraih barang-barang di kutipan tunggalmyApp
sumber
Saya akan menggunakan
pgrep
bukannyaps
seperti itu:Ini akan mengembalikan semua proses yang cocok
java
dan kemudian menyaring yang menampilkan hanya yang mengandung-Dapp.name=
. Bit terakhir,\w+
akan menampilkan nama program, dengan asumsi tidak mengandung spasi.CATATAN: The
-P
beralih kegrep
enlists kemampuan untuk menentukan hal-hal menggunakan PCRE - Perl Regular Expressions Kompatibel . Tidak semua versigrep
mendukungnya, tetapi sebagian besar melakukannya dengan versi Linux yang lebih modern.Jika Anda ingin seluruh output kunci / nilai kemudian ubah hal-hal seperti:
sumber