Çı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.