Çıktıdaki belirli bir parçayı yazdırma


11

Diyelim ki aşağıdaki gibi bir komut var:

cat /boot/config-3.19.0-32-generic | grep CONFIG_ARCH_DEFCONFIG

Çıktı şöyle:

CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"

Şimdi sorum şu: Yalnızca ters virgüllerin içinde ne yazdıracak komutlar var " "mı?

Ve lütfen komutu biraz açıklayabilir misiniz? Teşekkür ederim! önceden.


5
Kullanarak bu Not catbir boru kaynak (AKA kaybı hemen hemen her zaman UUOC ); grepgirdisini zaten bir dosyadan okuyabilir (yani grep CONFIG_ARCH_DEFCONFIG /boot/config-3.19.0-32-generictam olarak aynı şeyi yapar, ancak 1. Daha kısadır 2. Anlamak daha kolaydır 3. Ek bir kabuk ve ek bir işlem çatallamaz). Vakaların% 99'unda, birden fazla dosyayı birleştirmeden kedinin başlangıcında cat kullanmak sadece zararlıdır. :)
— kos

@kos - Thanx! Linux kullanmaya yeni başladığım için bunu bilmiyordum. Bunu akılda tutacak.
— Raphael

Np! Bu soruya rastlayan diğer insanlar için yukarıdaki yorumumu bırakıyorum.
— kos

İlk cat, bu durumda işe yaramaz olsa trda cut, daha sonra bir şeyi değiştirmek / eklemek / kaldırmak istiyorsanız, belki bir veya vb. Dosya adını bulmak ve taşımak zorunda kalmamanız durumunda gelecekte tüm komut satırını düzenlemeyi kolaylaştıracaktır. , diğer komutun onu desteklediğinden emin olun, nereye koyacağınızı vb. bulun. Küçük bir test dosyası için yalnızca 0.002s ekler. (Muhtemelen bunu yazmak için daha fazla zaman harcadım, gereksizcat
— şeylerden

1
@ Xen2050 catyardım neden burada? Yapabilir grep foo file | trya ... | cutda kolayca yapabilirsiniz cat file | tr | grep .... catSadece fazladan beş karakter, extra boru ve bir ekstra program çağrısı ekler ve basitleştiren bir şey yapmıyor değil.
— terdon

Yanıtlar:


15

Evet, yapabilirsin. Komutunuz:

cat /boot/config-3.19.0-32-generic | grep CONFIG_ARCH_DEFCONFIG | awk -F'"' '{print $2}'

yalnızca şunu döndürür:

arch/x86/configs/x86_64_defconfig

awkKomut ile alan ayırıcıları kullanır -Fkomuta ve aşağıdakiler gibi etrafında tek tırnak içinde yazın çift tırnak kullanmayı ayarlamak için -F'"'. Daha sonra '{print $2}'awk'ye alan ayırıcıdan sonra ikinci seti yazdırmasını söyler.

Bu yardımcı olur umarım!


14
@Terrance, Bu durumda bu catve ve işe yaramaz bir kullanımdır grep. Değiştirebilir catve grepparçası olabilirsiniz awk -F'"' '/CONFIG_ARCH_DEFCONFIG/{print $2}' /boot/config-3.19.0-32-generic . Daha az sıhhi tesisat, AWK, yapabileceğinden daha fazla olan tüm işleri yapmasına izin veriyor
— Sergiy Kolodyazhnyy

@Serg
— Tung Tran ile

@Serg Sorun yok. Ne dediğini anlıyorum. Sadece orijinal komutuna komut ekleyerek ekliyordum awk. =)
— Terrance

11

Bunu tek bir grepkomutla yapabilirsiniz:

grep -Po '^CONFIG_ARCH_DEFCONFIG="\K[^"]*' /boot/config-3.19.0-32-generic

Veya (biraz daha uzun ve daha kıvrımlı):

grep -Po '^CONFIG_ARCH_DEFCONFIG="\K.*?(?=")' /boot/config-3.19.0-32-generic
  • -P: grepkalıbı PCRE (Perl Uyumlu Düzenli İfade) olarak yorumlamayı söyler ;
  • -o: grepyalnızca eşleşmeyi yazdırmayı söyler ;
  • ^CONFIG_ARCH_DEFCONFIG=": CONFIG_ARCH_DEFCONFIG="satırın başındaki bir dizeyle eşleşir ;
  • \K: önceden eşleşen alt dizeyi atar;

# 1:

  • [^"]*: herhangi bir karakterin herhangi bir sayısıyla eşleşmez "(iştahla).

# 2:

  • .*?: herhangi bir karakterin herhangi bir sayısıyla (tembel olarak) eşleşir;
  • (?="): ileri (sıfır uzunluklu iddia, herhangi bir karakterle eşleşmiyor); Aşağıdaki karakter a ise eşleşir ".
% grep -Po '^CONFIG_ARCH_DEFCONFIG="\K[^"]*' /boot/config-4.2.0-16-generic
arch/x86/configs/x86_64_defconfig
% grep -Po '^CONFIG_ARCH_DEFCONFIG="\K.*?(?=")' /boot/config-4.2.0-16-generic
arch/x86/configs/x86_64_defconfig

Aynı sonuçları elde etmenin birden fazla yolunu öğrenmeyi seviyorum. Mükemmel cevap! =)
— Terrance

10

Bu kedinin derisini almanın birçok yolu var, işte bir sedyol:

sed -nr 's/^CONFIG_ARCH_DEFCONFIG="([^"]+)"$/\1/p' /boot/config-3.19.0-32-generic

Burada çizgiyi eşleştiriyoruz ve istenen kısmı, yani çift tırnak ( ([^"]+)) içindeki bölümü yakalıyoruz ve ardından tüm satırı \1sadece yakalanan grupla ( ) değiştiriyoruz.

Misal:

% sed -nr 's/^CONFIG_ARCH_DEFCONFIG="([^"]+)"$/\1/p' /boot/config-3.13.0-32-generic
arch/x86/configs/x86_64_defconfig

10

Ne, hayır perl?

grep CONFIG_ARCH_DEFCONFIG /boot/config-3.19.0-32-generic | 
    perl -pe 's/.*?"([^"]*).*/$1/'

perlOlacak -ptarafından verilen komut uygulandıktan sonra her satırını Rint -e. s/foo/bar/İkame edecektir fooile bar. Parantez içinde Desenler "yakalanan" ve olarak anılacaktır olabilir $1, $2... $Nnerede $1yakalanan 1 kalıptır, $2vb birinci tırnak (kadar her şey için bakacağız düzenli ifade ikinci .*?"), sonra 0 veya daha fazla olmayan yakalamak "karakterleri ( [^"]*) ve sonra her şey. Her şey yakalanan desenle değiştirilir.

Deseni aşağıdakilerle eşleştirerek de bırakabilirsiniz perl:

perl -ne 's/.*CONFIG_ARCH_DEFCONFIG="([^"]*).*/$1/ && print' /boot/config-3.19.0-32-generic

2
Bir noktada katılacağınızı biliyordum: P +1
— heemayl

o zaman bir python kodu
— üretirdim

with open('/boot/config-3.19.0-32-generic') as f: for line in f: if line.startswith('CONFIG_ARCH_DEFCONFIG'): print line.split('"')[1]
— Avinash Raj

@AvinashRaj iyi şeyler, bunu göndermek ister misiniz lütfen? Ben de regex ile bir tane gönderdi.
— Sergiy Kolodyazhnyy

8

İşte bir birleşimidir grepve cutaynı işi yapar.

$ grep "CONFIG_ARCH_DEFCONFIG" /boot/config-3.19.0-32-generic | cut -d"\"" -f2                                                
arch/x86/configs/x86_64_defconfig

Açıklama:

  • grep "CONFIG_ARCH_DEFCONFIG" /boot/config-3.19.0-32-genericStandart grep sözdiziminde, çizgi bulur kısmıdır: grep [OPTIONS] PATTERN [FILE...]. Çıkış borudan bir sonraki aşamaya geçer
  • cut -d"\"" -f2. Bu bölüm, belirli bir sınırlayıcıyla ( -dbayrakla belirtilir ) ayrılmış metni kesmek için kesmeyi kullanır . Ters tırnak işareti ile çift tırnaktan kaçmalıyız, böylece kabuk cut, kabuğun kendisine girmek yerine komutun seçeneklerinden biri olarak çift tırnak işareti almayı sağlar . Şimdi cutçıktı davranacak grepayrılmış olarak "üç sütun, içine ve split CONFIG_ARCH_DEFCONFIG, arch/x86/configs/x86_64_defconfigve boşluktan. İhtiyacımız olan çizgi ikinci sütundur, yani -f2bayrak kullanmamız gerekir .

3

Şu anda pythonburada öğrendiğimden beri tam olarak kullanan bir versiyon.

#!/usr/bin/env python
import re

reg = re.compile('CONFIG_ARCH_DEFCONFIG')

with open("/boot/config-3.19.0-32-generic") as file :
   for line in file:
       if reg.match(line):
           print line.split('"')[1]

Örnek çalışma:

DIR:/TECH-BOOKS
skolodya@ubuntu:$ ./extractString.py                                           
arch/x86/configs/x86_64_defconfig

DIR:/TECH-BOOKS
skolodya@ubuntu:$ cat ./extractString.py                                       
#!/usr/bin/env python
import re

reg = re.compile('CONFIG_ARCH_DEFCONFIG')

with open("/boot/config-3.19.0-32-generic") as file :
   for line in file:
       if reg.match(line):
           print line.split('"')[1]

girinti python için çok önemlidir7 ..
— Avinash Raj

1
Regexd için gitmenize gerek yok, sadece benimkini kullanın, line.startswithçünkü re.matchdaha yavaşstartswith
— Avinash Raj
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.