PS komutundan bir anahtar değer çifti nasıl ayıklanır


10

Ben psböyle bir komuttan uygulama adını ayıklamak çalışıyorum :

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

ve aşağıdakileri üretir:

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

Kullanmayı denedim egrepama çalışmıyor gibi görünüyor:

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

Yalnızca -Dapp.name"myApp" değerini nasıl alabilirim ?


grepdesen ile başlarsa, seçenekten -sonra koymanız gerekir -e. Aksi takdirde, bir seçenek olarak ele alınacaktır. Ama bu sadece kelimeyle eşleşecek, -Dapp.namearkasından gelen bölümle değil.
Barmar

dönüşümlü olarak:grep -o -- -Dapp.name
strugee

grep [j]avakomuttan kaçınmak için kullanabilirsiniz grep -v "grep"(bash üzerinde test edilmiştir)
HVNSweeting

Yanıtlar:



8

Aldığınız hata mesajını göstermiyorsunuz, ancak büyük olasılıkla

grep: bilinmeyen cihazlar yöntemi

Çünkü tüm komut satırı programlarının tümü veya en azından çoğu gibi grep, a ile başlayan her şeyin -bir seçenek olduğunu varsayar ve onu bu şekilde ayrıştırmaya çalışır. Bu durumda, bir aygıt dosyasıyla nasıl başa çıkılacağını öğretmek için -Dkullanılır grep( man grepayrıntılar için bkz .). Bunu atlatmanın bir yolu, aşağıdaki şeylerin bir seçenek bayrağı olmadığını --söyleyen kullanmaktır grep.

Bunu GNU'nun PCRE özelliğiyle birleştirerek grepşunları yapabilirsiniz:

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

Normal ifade -a'yı arar ve ( \K), ardından dize ve Dapp.name=ardından mümkün olduğunca çok sayıda boşluk olmayan karakter izler. Çıktı:

Dapp.name=myApp

myAppParçanın bir değişkene kaydedilmesini istiyorsanız, bunu yalnız ararım:

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

Bir değişkene atamak için:

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

Ancak, bu tür şeylerin grepçıktısını asla almamalısınız ps, bunun pgrepiçin:

app="$(pgrep -a java | grep -Po -- '^Dapp.name=\K[^\s]+')"

4
ps -af -u sas | sed -n '/[j]ava/s/.*-Dapp\.name=\([^ ]*\).*/\1/p'

3

ps … | grep …Grep'i her kullanışınızda ve grep'i sonuçlardan hariç tutmanız gerektiğinde, bunu yanlış yapıyorsunuz.

Çıktısını ayrıştırmanın sıfırıncı kuralı, varsa psdaha güvenilir araçlar kullanmaktır pgrep. Pgrep'niz varsa pgrep -f java, komutu çalıştıran tüm işlemleri listeler java. Seçenek -l, her işlem için komut satırını ekler.

Argümanını ayıklamak için -Dapp.namesed kullanabilirsiniz. Tüm çizgiyi eşleştirin, bir gruptaki ilginç kısmı doldurmak için düzenleyin ve bu grubu yazdırın.

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

Çıktısını ayrıştırmanın ilk kuralı, ihtiyacınız olan alanları seçmek için psseçeneği kullanmaktır -o. Burada, yalnızca komut bağımsız değişkenleriyle ilgileniyorsunuz, bu yüzden yalnızca bunu yazdırın.

ps -e -o args= | sed -n 's/^.*-Dapp\.name=\([^ ]*\).*$/\1/p'

3

Diğer cevaplardan daha karmaşık, ama bu getoptsizin için ayrıştırmayı işlemek için kullanır . Yine başka bir alternatif.

getopt -aql 'Dapp.name:' $(\
    ps -af -u sas | grep java | grep -v grep | tr -s ' ' | cut -d' ' -f8-\
) | cut -d"'" -f2
  1. emriniz: ps -af -u sas | grep java | grep -v grep
  2. tr -s ' ' hazırlanırken birden fazla boşluğu tek bir boşluğa "sıkıştırır" cut
  3. cut -d' ' -f8- çizgiyi boşluklarla böler ve 8 kapsayıcıdan sonra tüm alanları yakalar, sonuç /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:' $(...)komut seçeneklerini ayrıştırır ve yalnızca Dapp.namedeğeri olan (ile belirtilen :) eşleşen uzun adı verir , sonuç--Dapp.name 'myApp' --
  5. cut -d"'" -f2 tek tırnak içine almak
  6. Sonuç: myApp

0

Ben kullanırsınız pgrepyerine psşöyle:

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

Bu, eşleşen tüm işlemleri döndürür javave sonra yalnızca içerdiklerini gösterenleri filtreler -Dapp.name=. Son bit, \w+boşluk içermediği varsayılarak program adını gösterir.

NOT:-P geçiş grepenlists öğelerden belirtmek yeteneği PCRE'yi - Perl Uyumlu Düzenli İfadeler . Tüm sürümü grepdesteklemez, ancak çoğu Linux'un daha modern sürümlerinde bulunur.

Tüm anahtar / değer çıktısını istiyorsanız, şu şekilde değiştirin:

$ pgrep -fa java | grep -oP -- "-Dapp.name=\w+"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.