Grep / sed / awk kullanarak dizeden sözcük ayıklayın


12

Bir ipim var

00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256

ve qaaşağıdaki kelimeyi çıkarmak istiyorum -Dspring.profiles.active.

Ben sadece demo için bir dosya text.txt kaydetmek dize var.

Ben yaparken

grep -r -o "spring.profiles.active=" text.txt

Sonuç spring.profiles.active=

Bu kelime her zaman değil qa, olabilir prodya da dev.

Ne yapmak istiyorum kelimeyi bulmak spring.profiles.activeve sonra= kelimenin o özü.

Sunucudaki diğer öğeleri yapılandırmak için kelimeyi kullandığım için bu komut dosyasını kabuklamak istiyorum .

Bu mümkün mü ve eğer öyleyse, nasıl yaparım?


Zaten bu konuda meta görüşmeler olduğunu tahmin ediyorum, ama bu soru tamamen Ubuntu'ya özgü değildir. Neden unix.stackexchange.com yerine burada ?
Tony Adams

@TonyAdams Evet var: metin işleme soruları burada dolaylı olarak ele alınmıştır ve yine de fiili olarak her zaman konuyla ilgili olarak ele alınmıştır ve asla kapatılmamıştır / göç edilmemiştir; Ubuntu'nun özgüllüğünde, iki kez yakın zamanda, iki kez burada ve iki kez ve bir kez burada ele alınmıştır .
kos

iyi soru! : D
ncomputers

Yanıtlar:


20

grepPCRE ( -P) ile kullanabilirsiniz :

grep -Po 'spring.profiles.active=\K[^ ]+' <<<'.....string.....'
  • spring.profiles.active=bu alt dizeyi tam anlamıyla \Keşleştirecek, eşleşmeyi silecek

  • [^ ]+istenen bölümü, yani spring.profiles.active=sonraki boşluğa kadar olan bölümü seçecektir

Bir dosya için:

grep -Po 'spring.profiles.active=\K[^ ]+' file.txt

Misal:

% grep -Po 'spring.profiles.active=\K[^ ]+' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
qa

sed benzer bir mantık alır:

sed -r 's/.*spring.profiles.active=([^ ]+).*/\1/' <<<'.....string.....'

Misal:

% sed -r 's/.*spring.profiles.active=([^ ]+).*/\1/' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
qa

Kullanım hataları:

Senaryonuzda eşleşmenin olmadığı, diğer bir deyişle orijinal dizenizin bulunmadığı durumu ele almak isteyebilirsiniz spring.profiles.active=. Yukarıdaki sedörnekte, sorun yaratabilecek orijinal dizenin tamamını elde edersiniz:

% var="$(sed -r 's/.*spring.profiles.active=([^ ]+).*/\1/' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -XX:MaxPermSize=256')"
% echo $var
00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -XX:MaxPermSize=256

Eğer eşleşme yoktur boş dize elde etmek isterseniz, ekleme -nseçeneği sedkomutu ve pseçeneğine sed sböyle komutu:

% var="$(sed -rn 's/.*spring.profiles.active=([^ ]+).*/\1/p' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -XX:MaxPermSize=256')"
% echo $var

% var="$(sed -rn 's/.*spring.profiles.active=([^ ]+).*/\1/p' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256')"
% echo $var
qa

Sonra $ var'ın boş olup olmadığını test edebilirsiniz.


Teşekkürler @heemay, mükemmel çalışıyor. şimdi sadece senaryo yazmam gerekiyor. Cevap olarak işaretleyeceğim
Gman

@heemay bunu nasıl yazabileceğimi biliyor musun? Ben bir komut dosyası var ve ne zaman çalışır qa dön. Sonucu env adlı bir değişkene kaydetmek ve sonra bunu benzer bir şeyle karşılaştırmak istiyorum. [Env == qa] ise; sonra // bir şey yap ... başka bir şey yap ...
Gman

1
Evet @Gman .. sadece komut ikamesi kullanın: var="$(grep -Po 'spring.profiles.active=\K[^ ]+' file.txt)"değiştirmek file.txtile <<<'...string...'girdi bir dize değil, yapabileceğiniz file..then iseif [ "$var" = 'qa' ]; then do something; else do something; fi
heemayl

1

kullanma awk

awk -F"-Dspring.profiles.active=" '{sub(/ .*/,"",$2);print $2}' <<<'your_string'

veya

awk -F"-Dspring.profiles.active=" '{sub(/ .*/,"",$2);print $2}' your_file

Misal

% awk -F"-Dspring.profiles.active=" '{sub(/ .*/,"",$2);print $2}' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
qa

1

Karışıma bir Perl atacağım:

<<<'string' perl -lane '$F[3]=~s/.*?=//;print($F[3])'
  • -l: otomatik satır sonu işlemeyi etkinleştirir. İki ayrı etkisi vardır. İlk olarak, -n veya -p ile kullanıldığında $ / (giriş kayıt ayırıcısı) otomatik olarak keser. İkincisi, $ \ (çıkış kaydı ayırıcısı) octnum değerine sahip olur, böylece herhangi bir yazdırma ifadesi bu ayırıcıyı tekrar ekler. Oktnum atlanırsa, $ \ değerini geçerli $ / değerine ayarlar.
  • -a: -n veya -p ile kullanıldığında otomatik bölme modunu açar. @F dizisine örtük bir split komutu, -n veya -p tarafından üretilen örtük while döngüsü içinde ilk şey olarak yapılır.
  • n: Perl'in programınızın etrafında aşağıdaki döngüyü almasına neden olur, bu da onu sed -n veya awk gibi dosya adı bağımsız değişkenleri üzerinde yineleyerek yapar:

    LINE:
      while (<>) {
          ...             # your program goes here
      }
    
  • -e: bir program satırı girmek için kullanılabilir.
% <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256' perl -lane '$F[3]=~s/.*?=//;print($F[3])'
qa

orjinal regex şu şekilde de kullanılabilir:perl -nle '/spring.profiles.active=\K([^ ]+)/ && print $1' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
Manwe
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.