Menü
ücretsiz
Kayıt
Ev  /  Kurulum ve kurulum/ Düzenli ifadeler linux örnekleri. grep kullanımına ilişkin beş örnek

Linux düzenli ifade örnekleri. grep kullanımına ilişkin beş örnek

Linux terminalindeki en kullanışlı ve çok yönlü komutlardan biri "grep" komutudur. Grep, "global normal ifade baskısı" anlamına gelen bir kısaltmadır (yani, "eşleşen normal ifade satırlarını her yerde arayın ve çıktısını alın"). Bu, girdinin verilen kalıplarla eşleşip eşleşmediğini görmek için grep'in kullanılabileceği anlamına gelir.

Bu görünüşte önemsiz program, doğru kullanıldığında çok güçlüdür. Girdileri karmaşık kurallara göre sıralama yeteneği, onu birçok komut zincirinde popüler bir dosya haline getirir.

Bu öğretici, grep komutunun bazı özelliklerine bakar ve ardından normal ifadeleri kullanmaya geçer. Bu kılavuzda açıklanan tüm teknikler, bir sanal sunucuyu yönetmek için uygulanabilir.

Kullanım Temelleri

En basit haliyle grep, bir metin dosyasındaki harf kalıplarının eşleşmelerini bulmak için kullanılır. Bu, grep komutu bir arama sözcüğü alırsa, o sözcüğü içeren dosyanın her satırını yazdıracağı anlamına gelir.

Örnek olarak, bir Ubuntu sisteminde GNU Genel Kamu Lisansının 3. versiyonunda "GNU" kelimesini içeren satırları aramak için grep'i kullanabilirsiniz.

cd /usr/share/ortak lisanslar
grep "GNU" GPL-3
GNU GENEL KAMU LİSANSI





13. GNU Affero Genel Kamu Lisansı ile kullanın.
GNU Affero Genel Kamu Lisansının 3. sürümü altında tek bir
...
...

İlk bağımsız değişken olan "GNU", aranacak şablondur ve ikinci bağımsız değişken olan "GPL-3", aranacak girdi dosyasıdır.

Sonuç olarak, metin desenini içeren tüm satırlar görüntülenecektir. Bazı Linux dağıtımlarında, aranan model çıktı satırlarında vurgulanır.

Genel seçenekler

Varsayılan olarak grep, girdi dosyasında kesinlikle belirtilen kalıpları arar ve bulduğu satırları yazdırır. Ancak grep'in davranışı bazı ek işaretler eklenerek değiştirilebilir.

Arama parametresinin durumunu yoksaymak ve kalıbın hem büyük hem de küçük harf varyasyonlarını aramak istiyorsanız, "-i" veya "--ignore-case" yardımcı programlarını kullanabilirsiniz.

Örneğin, aynı dosyada "lisans" kelimesini büyük, küçük veya karışık harflerle aramak için grep'i kullanabilirsiniz.

grep -i "lisans" GPL-3
GNU GENEL KAMU LİSANSI
ancak bu lisans belgesinin değiştirilmesine izin verilmez.
GNU Genel Kamu Lisansı, ücretsiz, copyleft bir lisanstır.
Çoğu yazılım ve diğer pratik çalışmalar için lisanslar tasarlanmıştır.
GNU Genel Kamu Lisansı, özgürlüğünüzü garanti etmeyi amaçlamaktadır.
Yazılımlarımızın çoğu için GNU Genel Kamu Lisansı; için de geçerlidir


"Bu Lisans", GNU Genel Kamu Lisansının 3. sürümüne atıfta bulunur.
"Program", bu lisans kapsamında lisanslanan telif hakkına tabi her türlü çalışma anlamına gelir.
...
...

Gördüğünüz gibi, çıktı "LİSANS", "lisans" ve "Lisans" öğelerini içerir. Dosyada bir "LiCeNsE" örneği olsaydı, o da çıktılanırdı.
Belirtilen deseni içermeyen tüm satırları bulmak istiyorsanız, "-v" veya "--invert-match" bayraklarını kullanabilirsiniz.

Örnek olarak, BSD lisansında "the" kelimesini içermeyen tüm satırları aramak için aşağıdaki komutu kullanabilirsiniz:

grep -v "BSD"
Her hakkı saklıdır.
Yeniden dağıtım ve kaynak ve ikili formlarda, ile veya olmadan kullanım
karşılanır:
bu yazılımdan türetilen ürünleri desteklemek veya tanıtmak için kullanılabilir
önceden özel yazılı izin olmaksızın.
BU YAZILIM VEKİLLER VE KATKI SAĞLAYANLAR TARAFINDAN "OLDUĞU GİBİ" SAĞLANMAKTADIR VE
HERHANGİ BİR AÇIK VEYA ZIMNİ GARANTİ, DAHİL, ANCAK BUNLARLA SINIRLI OLMAMAK,
...
...

Gördüğünüz gibi "ignore case" komutu kullanılmadığı için son iki satır "the" kelimesini içermiyormuş gibi çıktı.

Eşleşmelerin bulunduğu satır numaralarını bilmek her zaman yararlıdır. "-n" veya "--line-number" işaretleri kullanılarak bulunabilirler.

Bu bayrağı önceki örnekte uygularsanız, aşağıdaki çıktı görüntülenecektir:

grep -vn "" BSD
2: Tüm hakları saklıdır.
3:
4: Yeniden dağıtım ve kaynak ve ikili formlarda, ile veya olmadan kullanım
6: karşılandı:
13: bu yazılımdan türetilen ürünleri desteklemek veya tanıtmak için kullanılabilir
14: önceden özel yazılı izin olmaksızın.
15:
16:BU YAZILIM VEKİLLER VE KATKI SAĞLAYANLAR TARAFINDAN "OLDUĞU GİBİ" SAĞLANMAKTADIR VE
17:ŞUNLAR DAHİL ANCAK BUNLARLA SINIRLI OLMAMAK ÜZERE HERHANGİ BİR AÇIK VEYA ZIMNİ GARANTİ
...
...

Artık "the" içermeyen her satırda değişiklik yapmak için gerektiği gibi satır numarasına başvurabilirsiniz.

Düzenli ifadeler

Giriş bölümünde bahsedildiği gibi grep, "global normal ifade baskısı" anlamına gelir. Normal ifade, belirli bir arama modelini açıklayan bir metin dizesidir.

Farklı uygulamalar ve programlama dilleri normal ifadeleri biraz farklı şekillerde kullanır. Bu kılavuz, Grep kalıplarının nasıl tanımlandığının yalnızca küçük bir alt kümesini kapsar.

Harf eşleşmeleri

Yukarıdaki "GNU" ve "the" kelimelerini arama örnekleri, "GNU" ve "the" karakter dizileriyle tam olarak eşleşen çok basit düzenli ifadeleri aradı.

Bunları kelime eşleşmelerinden çok karakter dizilerinin eşleşmeleri olarak temsil etmek daha doğrudur. Daha karmaşık kalıplara aşina oldukça, bu ayrım daha önemli hale gelecektir.

Verilen karakterlerle tam olarak eşleşen kalıplara "alfabetik" denir, çünkü kalıpla harf harf, karakter karakter eşleşirler.

Tüm alfabetik ve sayısal karakterler (diğer bazı karakterlerle birlikte), diğer ifade motorları tarafından değiştirilmedikçe tam anlamıyla eşleşir.

Çapa eşleşmeleri

Çapalar, istenen eşleşme dizisindeki konumu gösteren özel karakterlerdir.

Örneğin, aramanın en başta yalnızca "GNU" kelimesini içeren dizileri aramasını belirtebilirsiniz. Bunu yapmak için, sabit değer dizesinden önce "^" çapasını kullanmanız gerekir.

Bu örnekte, yalnızca en başında "GNU" kelimesini içeren satırların çıktısı verilmektedir.

grep "^GNU" GPL-3
Yazılımlarımızın çoğu için GNU Genel Kamu Lisansı; için de geçerlidir
GNU Genel Kamu Lisansı, şimdiye kadar yayınlanmış herhangi bir sürümü seçebilirsiniz

Benzer şekilde, "$" çıpası, eşleşmenin yalnızca aranan karakter dizisi metin dizisinin sonundaysa geçerli olduğunu belirtmek için hazır bilgi dizisinden sonra kullanılabilir.

Aşağıdaki normal ifade, yalnızca sonunda "ve" bulunan satırları verir:

grep "ve$" GPL-3
bu ücretsiz yazılım için herhangi bir garanti bulunmadığını. Her iki kullanıcı için" ve
Kopyalama, dağıtım ve kullanım için kesin hüküm ve koşullar


alternatife yalnızca ara sıra ve ticari olmayan bir şekilde izin verilir ve
değişikliğin kendisi maddi olarak ve
ağın çalışmasını olumsuz etkiler veya kuralları ihlal eder ve
geçici olarak, telif hakkı sahibi açıkça ve
çalıştırmak, değiştirmek ve değiştirmek için orijinal lisans sahiplerinden bir lisans alır.
yapmak, kullanmak, satmak, satışa sunmak, ithal etmek ve başka şekilde çalıştırmak, değiştirmek ve

Herhangi bir karakterle eşleş

Nokta (.), belirtilen konumda herhangi bir karakterin görünebileceğini belirtmek için normal ifadelerde kullanılır.

Örneğin, iki karakter ve ardından "cept" dizisini içeren eşleşmeleri bulmak istiyorsanız, aşağıdaki kalıbı kullanırsınız:

grep "..cept" GPL-3
tam olarak en kabul edilemez olduğu yer olan kullanım. Bu nedenle, biz
yürürlükteki telif hakkı yasası kapsamındaki ihlal, bunun dışında
kullanıcıya iş için herhangi bir garanti olmadığını söyler (yalnızca

ayrı yazılı bir lisans şeklinde veya istisna olarak belirtilmiş;
Kapsanan bir çalışmayı açıkça belirtilen durumlar dışında çoğaltamaz veya değiştiremezsiniz.
9. Kopya Almak İçin Kabul Gerekmez.
...
...

Gördüğünüz gibi sonuçlarda "kabul et" ve "hariç" kelimeleri ve bu kelimelerin varyasyonları gösteriliyor. Metinde bir tane varsa, kalıp aynı zamanda "z2cept" dizisiyle de eşleşir.

Parantez içindeki ifadeler

Bir karakter grubunu köşeli parantez ("") içine alarak, parantez içindeki karakterlerden herhangi birinin bu konumda olabileceğini belirtebilirsiniz.

Bu, "too" veya "two" içeren dizeleri bulmanız gerekirse, aşağıdaki kalıbı kullanarak bu varyasyonları kısaca belirtebileceğiniz anlamına gelir:

grep "ila" GPL-3
senin programların da

GNU GPL kullanan geliştiriciler, haklarınızı iki adımda korur:
kopya aktarımı olmayan bir bilgisayar ağı iletmiyor.

Karşılık gelen Kaynak bir ağ sunucusundan ücretsiz olarak.
...
...

Gördüğünüz gibi, dosyada her iki varyasyon da bulundu.

Basamaklama karakterleri ayrıca birkaç kullanışlı özellik sağlar. Parantez içindeki karakterlerin listesini "^" karakteriyle başlatarak, kalıbın parantez içindeki karakterler dışındaki her şeyle eşleşmesini sağlayabilirsiniz.

Bu örnekte, "kod" dizisiyle eşleşmemesi gereken ".ode" şablonu kullanılmıştır.

grep "[^c]ode" GPL-3
1. Kaynak kodu.
model, nesne koduna sahip olan herkese ya (1) bir
ürünün tek önemli kullanım şekli.
Etkileşimli modda başladığında şuna dikkat edin:

İkinci çıktı satırının "kod" kelimesini içerdiğini belirtmekte fayda var. Bu bir normal ifade veya grep hatası değildir.

Daha ziyade, bu satır, "model" kelimesinde bulunan model eşleştirme "mod" dizisini de içerdiği için çıkarılmıştır. Yani, dizi, kalıpla eşleştiği için çıktı olarak alındı.

Köşeli parantezlerin bir başka kullanışlı özelliği de, her karakteri ayrı ayrı yazmak yerine, bir karakter aralığı belirleme yeteneğidir.

Bu, büyük harfle başlayan her satırı bulmak istiyorsanız aşağıdaki kalıbı kullanabileceğiniz anlamına gelir:

grep "^" GPL-3
Yazılımlarımızın çoğu için GNU Genel Kamu Lisansı; için de geçerlidir

lisans. Her lisans sahibine "siz" olarak hitap edilir. "Lisanslar" ve


Sistem Kitaplıkları veya genel amaçlı araçlar veya genellikle ücretsiz
kaynak.

...
...

Bazı doğal sıralama sorunları nedeniyle, daha doğru bir sonuç için yukarıdaki örnekte kullanılan karakter aralığı yerine POSIX standart karakter sınıflarını kullanmak daha iyidir.
Bu kılavuzda ele alınmayan birçok karakter sınıfı vardır; örneğin, yukarıdaki örnektekiyle aynı prosedürü gerçekleştirmek için parantez içinde "[:upper:]" karakter sınıfını kullanabilirsiniz.

grep "^[[:üst:]]" GPL-3
Yazılımlarımızın çoğu için GNU Genel Kamu Lisansı; için de geçerlidir
Devletler, patentlerin geliştirilmesini ve kullanılmasını kısıtlamasına izin vermemelidir.
lisans. Her lisans sahibine "siz" olarak hitap edilir. "Lisanslar" ve
Bileşeni ve (b) yalnızca o parça ile çalışmanın kullanılmasını sağlamaya yarar.
Ana Bileşen veya bir Standart Arayüz uygulamak için
Sistem Kitaplıkları veya genel amaçlı araçlar veya genellikle ücretsiz
kaynak.
Kullanıcı Ürünü kalıcı olarak veya bir süre için alıcıya aktarılır.
...
...

Deseni tekrarla (0 veya daha fazla kez)

En sık kullanılan meta karakterlerden biri, "önceki karakteri veya ifadeyi 0 veya daha fazla kez tekrarla" anlamına gelen "*" karakteridir.

Örneğin, açılış ve kapanış parantezleri ile sadece harfler ve aralarında tek boşluk bulunan her satırı bulmak istiyorsanız aşağıdaki ifadeyi kullanabilirsiniz:

grep "(*)" GPL-3

dağıtım (değiştirerek veya değiştirmeden),
işin bir bütün olarak yerine, (a)'nın normal biçime dahil edilmesi
Bileşeni ve (b) yalnızca o parça ile çalışmanın kullanılmasını sağlamaya yarar.
(varsa) üzerinde yürütülebilir çalışmanın çalıştığı veya bunun için kullanılan bir derleyici
(fiziksel bir dağıtım ortamı dahil) ile birlikte
(fiziksel bir dağıtım ortamı dahil), bir
yer (ücretsiz veya ücretli) ve şuraya eşdeğer erişim sunar:
...
...

Meta karakterlerden nasıl kaçınılır?

Bazen gerçek bir nokta veya gerçek bir açık parantez aramak isteyebilirsiniz. Bu karakterlerin normal ifadelerde belirli bir anlamı olduğundan, grep'e bu durumda özel anlamlarını kullanmamasını söyleyerek onlardan "kaçmanız" gerekir.

Bu karakterlerden, genellikle özel bir anlamı olan bir karakterden önce ters eğik çizgi (\) kullanılarak çıkılabilir.

Örneğin büyük harfle başlayıp nokta ile biten bir dizi bulmak istiyorsanız aşağıdaki ifadeyi kullanabilirsiniz. Son noktadan önceki ters eğik çizgi, komuta bundan "kaçınmasını" söyler, böylece son nokta gerçek bir noktayı temsil eder ve "herhangi bir karakter" anlamına gelmez:

grep "^.*\.$" GPL-3
kaynak.
Koşullarından bir veya daha fazlasından istisnalar yaparak lisans.
Lisans, Programı iletmekten tamamen kaçınmak olacaktır.
GEREKLİ TÜM SERVİS, ONARIM VEYA DÜZELTME.
BU TÜR HASARLAR.
Ayrıca sizinle elektronik ve kağıt posta yoluyla nasıl iletişime geçileceği hakkında bilgi ekleyin.

Genişletilmiş normal ifadeler

Grep komutu, "-E" bayrağı kullanılarak veya "grep" yerine "egrep" komutu çağrılarak genişletilmiş normal ifade diliyle de kullanılabilir.

Bu komutlar "genişletilmiş normal ifadeler" olanaklarını açar. Genişletilmiş normal ifadeler, tüm temel meta karakterlerin yanı sıra daha karmaşık eşleşmeleri ifade etmek için ek meta karakterleri içerir.

Gruplama

Genişletilmiş düzenli ifadelerin en basit ve kullanışlı özelliklerinden biri, ifadeleri gruplandırabilme ve bir bütün olarak kullanabilme yeteneğidir.

Parantezler ifadeleri gruplandırmak için kullanılır. Genişletilmiş normal ifadelerin dışında parantez kullanmanız gerekirse, bunlar ters eğik çizgi ile "kaçınılabilir"

grep "\(gruplama\)" dosya.txt
grep -E "(gruplandırma)" file.txt
egrep "(gruplama)" file.txt

Yukarıdaki ifadeler eşdeğerdir.

münavebe

Köşeli parantezlerin tek bir karakter için olası farklı eşleşmeleri belirtmesi gibi, dönüşüm de karakter dizileri veya ifade kümeleri için alternatif eşleşmeler belirlemenizi sağlar.

Dikey çubuk karakteri "|", değişimi belirtmek için kullanılır. Değiştirme, gruplamada genellikle iki veya daha fazla seçenekten birinin eşleşme olarak kabul edilmesi gerektiğini belirtmek için kullanılır.

Bu örnekte, "GPL" veya "Genel Kamu Lisansı"nı bulmanız gerekir:

grep -E "(GPL|Genel Kamu Lisansı)" GPL-3
GNU Genel Kamu Lisansı, ücretsiz, copyleft bir lisanstır.
GNU Genel Kamu Lisansı, özgürlüğünüzü garanti etmeyi amaçlamaktadır.
Yazılımlarımızın çoğu için GNU Genel Kamu Lisansı; için de geçerlidir
fiyat. Genel Kamu Lisanslarımız, şunları yaptığınızdan emin olmak için tasarlanmıştır:
GNU GPL kullanan geliştiriciler, haklarınızı iki adımda korur:
Geliştiricilerin ve yazarların koruması için, GPL açıkça açıklar
yazarların hatırına, GPL değiştirilmiş sürümlerin şu şekilde işaretlenmesini gerektirir:
GPL'nin bu sürümünü, uygulamayı yasaklamak için tasarladık.
...
...

Değiştirme, iki veya daha fazla seçenek arasında seçim yapmak için kullanılabilir; bunu yapmak için, seçim grubundaki kalan seçenekleri her birini "|" dikey çizgi karakteriyle ayırarak girmeniz gerekir.

niceleyiciler

Genişletilmiş düzenli ifadelerde, "*" meta karakterinin önceki karakterin veya karakter dizisinin 0 veya daha fazla kez eşleşmesini göstermesi gibi, bir karakterin ne sıklıkta tekrarlandığını gösteren meta karakterler vardır.

Bir karakter eşleşmesini 0 veya daha fazla kez belirtmek için "?" karakterini kullanabilirsiniz. Önceki karakteri veya karakter kümesini temelde isteğe bağlı hale getirecektir.

Bu örnekte, isteğe bağlı gruba "kopya" dizisini ekleyerek, "telif hakkı" ve "sağ" eşleşmeleri görüntülenir:

grep -E "(kopya)?doğru" GPL-3
Telif Hakkı (C) 2007 Özgür Yazılım Vakfı, Inc.
Haklarınızı korumak için başkalarının sizi inkar etmesini önlememiz gerekiyor.
bu haklar veya haklardan vazgeçmenizi istemek. Bu nedenle, sahip olduğunuz
haklarını bilmek.
GNU GPL kullanan geliştiriciler, haklarınızı iki adımda korur:
(1) yazılım üzerinde telif hakkı ileri sürmek ve (2) size bu Lisansı sunmak
"Telif hakkı" aynı zamanda diğer telif hakkı türleri için geçerli olan telif hakkı benzeri yasalar anlamına gelir.
...
...

"+" Sembolü, ifadelerle 1 veya daha fazla kez eşleşir. Neredeyse "*" karakteri gibi çalışır, ancak "+" kullanılırken ifadenin en az 1 kez eşleşmesi gerekir.

Aşağıdaki ifade, "serbest" dizesi artı 1 veya daha fazla boşluk olmayan karakterle eşleşir:

grep -E "ücretsiz[^[:boşluk:]]+" GPL-3
GNU Genel Kamu Lisansı, ücretsiz, copyleft bir lisanstır.
eserleri paylaşma ve değiştirme özgürlüğünüzü elinizden almak. Buna karşılık,
GNU Genel Kamu Lisansı, özgürlüğünüzü garanti etmeyi amaçlamaktadır.
Özgür yazılımdan bahsettiğimizde özgürlükten bahsediyoruz, değil
özgür yazılımın kopyalarını dağıtma özgürlüğüne sahiptir (ve

aldığınız özgürlükler. Onların da aldığından emin olmalısınız.
kullanıcıların yazılımı değiştirme özgürlüğünün korunması. Sistematik
GPL'nin, kullanıcıların özgürlüğünü korumak için gerektiği şekilde.
patentler programı özgür olmayan hale getirmek için kullanılamaz.

Maç tekrar sayısı

Kıvrımlı parantezler ("( )"), eşleşmelerin tekrar sayısını belirtmek için kullanılabilir. Bu karakterler, bir ifadenin eşleşme sayısına ilişkin tam sayıyı, aralığı ve üst ve alt sınırları belirtmek için kullanılır.

Üç sesli harfin birleşimini içeren tüm dizeleri bulmak istiyorsanız, aşağıdaki ifadeyi kullanabilirsiniz:

grep -E "(3)" GPL-3
değişti, böylece sorunları yanlışlıkla
Önceki sürümlerin yazarları.
dikkat çekecek şekilde ve
önceki paragraf uyarınca vermek, artı mülkiyet hakkı
bu kapsamdaki yükümlülüklerinizi aynı anda yerine getirmek için kapsam dahilindeki iş
16-20 karakter uzunluğundaki tüm kelimeleri bulmanız gerekiyorsa, aşağıdaki ifadeyi kullanın:
grep -E "[[:alpha:]](16,20)" GPL-3
Yazılımın kopyalarını dağıtırsanız veya
siz değiştirirsiniz: başkalarının özgürlüğüne saygı duyma sorumlulukları.
c) Söz konusu materyalin kaynağına ilişkin yanlış beyanın yasaklanması veya

sonuçlar

Birçok durumda, grep komutu, dosyalar veya dosya sistemi hiyerarşisi içindeki kalıpları aramak için kullanışlıdır. Çok zaman kazandırır, bu nedenle parametrelerini ve sözdizimini öğrenmelisiniz.

Normal ifadeler daha da çok yönlüdür ve birçok popüler programda kullanılabilir. Örneğin, birçok metin düzenleyicisi, metni bulmak ve değiştirmek için normal ifadeler kullanır.

Ayrıca, gelişmiş programlama dilleri, belirli veri parçaları üzerinde prosedürleri yürütmek için düzenli ifadeler kullanır. Düzenli ifadelerle çalışabilme özelliği, bilgisayarla ilgili yaygın sorunların çözümünde faydalı olacaktır.

Etiketler: ,

Bash betiklerindeki metinleri sed ve awk ile tam olarak işlemek için normal ifadeleri anlamanız yeterlidir. Bu en kullanışlı aracın uygulamaları kelimenin tam anlamıyla her yerde bulunabilir ve tüm normal ifadeler benzer şekilde, aynı fikirlere dayalı olarak düzenlense de, onlarla çalışmanın farklı ortamlarda belirli özellikleri vardır. Burada Linux komut satırı betiklerinde kullanıma uygun olan düzenli ifadelerden bahsedeceğiz.

Bu materyal, normal ifadelerin ne olduğunu bilmeyenler için normal ifadelere giriş niteliğindedir. Bu nedenle, en baştan başlayalım.

normal ifadeler nelerdir

Birçoğu için, normal ifadeleri ilk gördüklerinde, önlerinde anlamsız bir karakter karmaşası olduğu düşüncesi hemen ortaya çıkar. Ancak bu, elbette, durumdan çok uzak. Örneğin bu regex'e bir göz atın


Bize göre, tamamen yeni başlayan biri bile bunun nasıl çalıştığını ve neden gerekli olduğunu hemen anlayacaktır :) Tam olarak anlamadıysanız, okumaya devam edin ve her şey yerine oturacaktır.
Normal ifade, sed veya awk gibi programların metni filtrelemek için kullandığı bir kalıptır. Şablonlar, kendilerini temsil eden normal ASCII karakterlerini ve örneğin belirli karakter gruplarına atıfta bulunmanıza izin veren özel bir rol oynayan sözde meta karakterleri kullanır.

Normal ifade türleri

Düzenli ifadelerin çeşitli ortamlarda, örneğin Java, Perl ve Python gibi programlama dillerinde, sed, awk ve grep gibi Linux araçlarında uygulanmasının belirli özellikleri vardır. Bu özellikler, kalıpların yorumlanmasıyla ilgilenen sözde düzenli ifade işleme motorlarına bağlıdır.
Linux'un iki düzenli ifade motoru vardır:
  • POSIX Temel Düzenli İfade (BRE) standardını destekleyen bir motor.
  • POSIX Genişletilmiş Normal İfade (ERE) standardını destekleyen bir motor.
Çoğu Linux yardımcı programı en azından POSIX BRE standardına uygundur, ancak bazı yardımcı programlar (sed dahil) BRE standardının yalnızca bir alt kümesini anlar. Bu sınırlamanın nedenlerinden biri, bu tür yardımcı programları kelime işlemede olabildiğince hızlı hale getirme isteğidir.

POSIX ERE standardı genellikle programlama dillerinde uygulanmaktadır. Düzenli ifadeler geliştirirken birçok araç kullanmanıza olanak tanır. Örneğin bunlar, metinde tek tek sözcükleri veya sayı kümelerini aramak gibi sık kullanılan kalıplar için özel karakter dizileri olabilir. Awk, ERE standardını destekler.

Programcının görüşüne ve altında oluşturuldukları motorun özelliklerine bağlı olarak düzenli ifadeler geliştirmenin birçok yolu vardır. Herhangi bir motorun anlayabileceği genel düzenli ifadeler yazmak kolay değildir. Bu nedenle, en sık kullanılan düzenli ifadelere odaklanacağız ve sed ve awk için uygulamalarının ayrıntılarına bakacağız.

POSIX BRE düzenli ifadeleri

Belki de en basit BRE modeli, metindeki bir dizi karakterin tam eşleşmesini bulmak için kullanılan bir normal ifadedir. sed ve awk'de bir dize aramak şu şekilde görünür:

$ echo "Bu bir testtir" | sed -n "/test/p" $ echo "Bu bir testtir" | awk "/test/($0 yazdır)"

sed'de kalıba göre metin bulma


ak'de kalıba göre metin bulma

Belirli bir kalıp için aramanın, metnin dizedeki tam konumu dikkate alınmadan gerçekleştirildiğini fark edebilirsiniz. Ayrıca, oluşum sayısı önemli değildir. Normal ifade, verilen metni dizenin herhangi bir yerinde bulduktan sonra, dize uygun kabul edilir ve sonraki işlemler için iletilir.

Normal ifadelerle çalışırken büyük/küçük harfe duyarlı olduklarını unutmayın:

$ echo "Bu bir testtir" | awk "/Test/($0 yazdır)" $ echo "Bu bir testtir" | awk "/test/($0 yazdır)"

Normal ifadeler büyük/küçük harfe duyarlıdır

Büyük harfle başlayan "test" kelimesi metinde geçmediği için ilk normal ifade herhangi bir eşleşme bulamadı. Büyük harflerle yazılmış bir kelimeyi aramak için yapılandırılmış olan ikincisi, akışta uygun bir dize buldu.

Normal ifadelerde yalnızca harfleri değil, boşlukları ve sayıları da kullanabilirsiniz:

$ echo "Bu yine bir test 2" | awk "/test 2/($0 yazdır)"

Boşluklar ve sayılar içeren bir metin parçası bulma

Boşluklar, normal ifade motoru tarafından normal karakterler olarak ele alınır.

Özel semboller

Normal ifadelerde farklı karakterler kullanırken akılda tutulması gereken birkaç şey vardır. Örneğin, bir şablonda kullanıldığında özel bir yaklaşım gerektiren bazı özel karakterler veya meta karakterler vardır. İşte buradalar:

.*^${}\+?|()
Modelde bunlardan birine ihtiyaç duyulursa, ters eğik çizgi (ters eğik çizgi) - \ ile kaçılması gerekir.

Örneğin, metinde bir dolar işareti bulmanız gerekiyorsa, önce bir kaçış karakteri gelecek şekilde şablona dahil edilmelidir. Diyelim ki aşağıdaki metni içeren bir dosyam var:

Cebimde 10$ var
Dolar işareti şuna benzer bir modelle tespit edilebilir:

$ awk "/\$/($0 yazdır)" dosyam

Bir şablonda özel bir karakter kullanma

Ek olarak, ters eğik çizgi de özel bir karakterdir, bu nedenle onu bir şablonda kullanmak istiyorsanız, ondan da kaçmanız gerekecektir. Birbirini takip eden iki eğik çizgi gibi görünüyor:

$ echo "\ özel bir karakterdir" | awk "/\\/($0 yazdır)"

ters eğik çizgi kaçıyor

Eğik çizgi, yukarıdaki özel karakterler listesinde olmamasına rağmen, sed veya awk için yazılmış bir normal ifadede kullanılmaya çalışılması hatayla sonuçlanacaktır:

$ yankı "3 / 2" | awk "///($0 yazdır)"

Bir şablonda eğik çizginin yanlış kullanımı

Gerekirse, ayrıca kaçılmalıdır:

$ yankı "3 / 2" | awk "/\//($0 yazdır)"

Bir eğik çizgiden kaçmak

Çapa sembolleri

Bir kalıbı bir metin dizisinin başına veya sonuna sabitlemek için iki özel karakter vardır. Büyük harf simgesi - ^, metin satırlarının başındaki karakter dizilerini tanımlamanıza olanak tanır. Aradığınız kalıp dizede başka bir yerde görünüyorsa, normal ifade buna yanıt vermeyecektir. Bu sembolün kullanımı şöyle görünür:

$ echo "likegeeks web sitesine hoş geldiniz" | awk "/^likegeeks/(0 $ yazdır)" $ echo "likegeeks web sitesi" | awk "/^likegeeks/($0 yazdır)"

Bir dizenin başında bir kalıp arayın

^ sembolü, karakterlerin durumu da dikkate alınırken, bir satırın başında bir kalıp aramak için tasarlanmıştır. Bunun bir metin dosyasının işlenmesini nasıl etkileyeceğini görelim:

$ awk "/^this/($0 yazdır)" dosyam


Bir dosyadaki metinde bir satırın başında bir kalıp arayın

sed kullanırken, bir kalıbın içinde herhangi bir yere bir son eklerseniz, diğer herhangi bir normal karakter gibi ele alınacaktır:

$ echo "Bu ^ bir testtir" | sed -n "/s ^/p"

Kapak, sed'deki desenin başlangıcında değil

awk'de, aynı kalıp kullanılırken, verilen karakterden çıkış yapılmalıdır:

$ echo "Bu ^ bir testtir" | awk "/s \^/($0 yazdır)"

awk'de bir desenin başında olmayan bir kapak

Satırın başındaki metin parçalarını ararken bunu anladık. Ya bir satırın sonunda bir şey bulmanız gerekirse?

Satır sonu için çapa karakteri olan dolar işareti - $ bu konuda bize yardımcı olacaktır:

$ echo "Bu bir testtir" | awk "/test$/($0 yazdır)"

Bir satırın sonundaki metni bulma

Her iki bağlantı karakteri de aynı modelde kullanılabilir. Aşağıdaki şekilde içeriği gösterilen myfile dosyasını aşağıdaki normal ifadeyi kullanarak işleyelim:

$ awk "/^bu bir testtir$/($0 yazdır)" dosyam


Bir dizenin başı ve sonu için özel karakterler kullanan bir kalıp

Gördüğünüz gibi, şablon yalnızca verilen karakter dizisine ve konumlarına tam olarak karşılık gelen bir diziye tepki verdi.

Bağlantı karakterlerini kullanarak boş satırları nasıl filtreleyeceğiniz aşağıda açıklanmıştır:

$ awk "!/^$/($0 yazdır)" dosyam
Bu şablonda olumsuzlama sembolünü, ünlem işaretini - ! . Bu kalıp kullanılarak satırın başı ile sonu arasında hiçbir şey içermeyen satırlar aranır ve ünlem işareti sayesinde yalnızca bu desenle eşleşmeyen satırlar yazdırılır.

nokta karakteri

Nokta, yeni satır karakteri dışında herhangi bir tek karakteri aramak için kullanılır. myfile dosyasını, içeriği aşağıda verilen böyle bir düzenli ifadeye aktaralım:

$ awk "/.st/($0 yazdır)" dosyam


Normal ifadelerde nokta kullanma

Çıktıdan da görülebileceği gibi, dosyanın yalnızca ilk iki satırı, önünde başka bir karakter olan "st" karakter dizisini içerdiklerinden, üçüncü satır uygun bir dizi içermediğinden ve dördüncü satır desenle eşleşir. yapar, ancak satırın en başındadır.

Karakter sınıfları

Bir nokta, herhangi bir tek karakterle eşleşir, ancak aradığınız karakter kümesini daha esnek bir şekilde sınırlamak isterseniz ne olur? Böyle bir durumda karakter sınıflarını kullanabilirsiniz.

Bu yaklaşım sayesinde, belirli bir kümeden herhangi bir karakter için bir arama düzenleyebilirsiniz. Bir karakter sınıfını tanımlamak için köşeli parantezler - kullanılır:

$ awk "/th/($0 yazdır)" dosyam


Normal ifadede bir karakter sınıfının açıklaması

Burada, "o" karakteri veya "i" karakterinden önce gelen "th" karakter dizisini arıyoruz.

Sınıflar, büyük veya küçük harfle başlayabilen kelimeleri ararken kullanışlıdır:

$ echo "bu bir testtir" | awk "/bu bir test/(yazdır $0)" $ echo "Bu bir test" | awk "/bu bir test/($0 yazdır)"

Küçük veya büyük harfle başlayabilen kelimeleri arayın

Karakter sınıfları harflerle sınırlı değildir. Burada başka karakterler de kullanılabilir. Hangi durumda sınıflara ihtiyaç duyulacağını önceden söylemek imkansızdır - hepsi çözülmekte olan soruna bağlıdır.

Olumsuz karakter sınıfları

Sembol sınıfları, yukarıda açıklanan ters problemi çözmek için de kullanılabilir. Yani, sınıfa dahil olan sembolleri aramak yerine, sınıfa dahil olmayan her şey için bir arama düzenleyebilirsiniz. Normal bir ifadenin bu davranışını elde etmek için, sınıf karakterleri listesinin önüne ^ işareti koymanız gerekir. Şuna benziyor:

$ awk "/[^oi]th/($0 yazdır)" dosyam


Bir sınıfta olmayan karakterleri ara

Bu durumda, önünde ne "o" ne de "i" olmayan "th" karakter dizileri bulunacaktır.

Karakter aralıkları

Karakter sınıflarında, karakter aralıklarını kısa çizgiler kullanarak tanımlayabilirsiniz:

$ awk "/st/($0 yazdır)" dosyam


Bir karakter sınıfındaki bir karakter aralığını tanımlama

Bu örnekte, normal ifade, "e" ve "p" karakterleri arasında alfabetik sırayla bulunan herhangi bir karakterin önünde yer alan "st" karakter dizisiyle eşleşir.

Aralıklar ayrıca sayılardan da oluşturulabilir:

$ yankı "123" | awk "//" $ yankı "12a" | "//"

Herhangi üç sayıyı bulmak için normal ifade

Bir karakter sınıfı birden çok aralık içerebilir:

$ awk "/st/($0 yazdır)" dosyam


Birden çok aralıktan oluşan karakter sınıfı

Bu normal ifade, a-f ve m-z aralığındaki karakterlerin önünde gelen tüm "st" dizileriyle eşleşecektir.

Özel karakter sınıfları

BRE, düzenli ifadeler yazarken kullanılabilecek özel karakter sınıflarına sahiptir:
  • [[:alpha:]] - büyük veya küçük harfle yazılmış herhangi bir alfabetik karakterle eşleşir.
  • [[:alnum:]] - herhangi bir alfasayısal karakterle, yani 0-9 , A-Z , a-z aralığındaki karakterlerle eşleşir.
  • [[:blank:]] - Bir boşluk ve bir sekmeyle eşleşir.
  • [[:digit:]] - 0 ile 9 arasındaki herhangi bir sayısal karakter.
  • [[:upper:]] - büyük harf alfabetik karakterler - A-Z .
  • [[:lower:]] - küçük alfabetik karakterler - a-z .
  • [[:print:]] - yazdırılabilir herhangi bir karakterle eşleşir.
  • [[:punk:]] - noktalama işaretleriyle eşleşir.
  • [[:space:]] - boşluk karakterleri, özellikle - boşluk, sekme, karakterler NL , FF , VT , CR .
Özel sınıfları aşağıdaki gibi şablonlarda kullanabilirsiniz:

$ yankı "abc" | awk "/[[:alpha:]]/($0 yazdır)" $ echo "abc" | awk "/[[:digit:]]/($0 yazdır)" $ echo "abc123" | awk "/[[:digit:]]/($0 yazdır)"


Normal ifadelerde özel karakter sınıfları

yıldız işareti

Bir kalıptaki bir karakterden sonra bir yıldız işareti koyarsanız, bu, karakterin dizide herhangi bir sayıda görünmesi durumunda - karakterin dizide olmadığı durum da dahil olmak üzere - normal ifadenin çalışacağı anlamına gelir.

$ yankı "deneme" | awk "/tes*t/($0 yazdır)" $ echo "tessst" | awk "/tes*t/($0 yazdır)"


Normal ifadelerde * karakterini kullanma

Bu joker karakter genellikle her zaman yanlış yazılan sözcüklerle veya farklı şekilde yazılabilen sözcüklerle çalışmak için kullanılır:

$ echo "Yeşil rengi severim" | awk "/color*r/(print $0)" $ echo "Yeşil rengi severim " | awk "/color*r/($0 yazdır)"

Farklı yazılışları olan bir kelime bulma

Bu örnekte, aynı normal ifade hem "renk" kelimesiyle hem de "renk" kelimesiyle eşleşir. Bunun nedeni, ardından bir yıldız işareti gelen "u" karakterinin ya bulunmayabilmesi ya da art arda birkaç kez ortaya çıkabilmesidir.

Yıldız karakterinden kaynaklanan bir diğer kullanışlı özellik ise onu nokta ile birleştirmek. Bu kombinasyon, normal ifadenin herhangi bir sayıda herhangi bir karaktere yanıt vermesini sağlar:

$ awk "/this.*test/($0 yazdır)" dosyam


Herhangi bir sayıda herhangi bir karaktere yanıt veren şablon

Bu durumda "bu" ve "test" kelimeleri arasında kaç tane ve hangi karakterin olduğu önemli değildir.

Yıldız işareti, karakter sınıflarıyla da kullanılabilir:

$ yankı "st" | awk "/s*t/($0 yazdır)" $ echo "sat" | awk "/s*t/($0 yazdır)" $ echo "ayarla" | awk "/s*t/($0 yazdır)"


Yıldız işaretini karakter sınıflarıyla kullanma

Her üç örnekte de normal ifade çalışır çünkü karakter sınıfından sonraki yıldız işareti, herhangi bir sayıda "a" veya "e" karakteri bulunursa veya bulunmazlarsa, dizenin verilen kalıpla eşleşeceği anlamına gelir.

POSIX ERE normal ifadeleri

Bazı Linux yardımcı programlarının desteklediği POSIX ERE şablonları ek karakterler içerebilir. Daha önce belirtildiği gibi, awk bu standardı destekler, ancak sed desteklemez.

Burada, kendi düzenli ifadelerinizi oluştururken işinize yarayacak olan ERE kalıplarında en sık kullanılan karakterlere bakacağız.

▍Soru işareti

Soru işareti, önceki karakterin metinde bir kez bulunabileceğini veya hiç kullanılamayacağını belirtir. Bu karakter, tekrar eden meta karakterlerden biridir. İşte bazı örnekler:

$ yankı "tet" | awk "/tes?t/($0 yazdır)" $ echo "deneme" | awk "/tes?t/($0 yazdır)" $ echo "test" | awk "/tes?t/($0 yazdır)"


Normal ifadelerde soru işareti

Gördüğünüz gibi üçüncü durumda “s” harfi iki kez geçtiği için normal ifade “testst” kelimesine cevap vermiyor.

Soru işareti, karakter sınıflarıyla da kullanılabilir:

$ yankı "tst" | awk "/t?st/($0 yazdır)" $ echo "deneme" | awk "/t?st/(yazdır $0)" $ echo "tat" | awk "/t?st/($0 yazdır)" $ echo "taest" | awk "/t?st/($0 yazdır)" $ echo "teest" | awk "/t?st/($0 yazdır)"


Soru işareti ve karakter sınıfları

Dizede sınıftan hiç karakter yoksa veya bunlardan biri bir kez ortaya çıkarsa, normal ifade çalışır, ancak sözcükte iki karakter belirir görünmez sistem artık metindeki kalıp için bir eşleşme bulamaz.

▍Artı simgesi

Kalıptaki artı işareti, önceki karakter metinde bir veya daha fazla kez geçtiğinde normal ifadenin eşleşmeyle eşleşeceğini gösterir. Aynı zamanda, böyle bir yapı, bir sembolün yokluğuna tepki vermeyecektir:

$ yankı "deneme" | awk "/te+st/($0 yazdır)" $ echo "teest" | awk "/te+st/($0 yazdır)" $ echo "tst" | awk "/te+st/($0 yazdır)"


Ayrıca normal ifadelerde oturum açın

Bu örnekte kelimede "e" karakteri yoksa normal ifade motoru metinde eşleşme bulamayacaktır. Artı simgesi, karakter sınıflarıyla da çalışır - bu şekilde yıldız işaretine ve soru işaretine benzer:

$ yankı "tst" | awk "/t+st/($0 yazdır)" $ echo "deneme" | awk "/t+st/($0 yazdır)" $ echo "alay" | awk "/t+st/($0 yazdır)" $ echo "teeast" | awk "/t+st/($0 yazdır)"


Artı işaret ve karakter sınıfları

Bu durumda, dize sınıftan herhangi bir karakter içeriyorsa, metnin kalıpla eşleştiği kabul edilecektir.

▍ Kıvrık parantezler

ERE modellerinde kullanılabilen süslü parantezler, yukarıda tartışılan karakterlere benzer, ancak kendilerinden önce gelen karakterin gerekli oluşum sayısını daha kesin olarak belirlemenize olanak tanır. İki biçimde bir sınır belirleyebilirsiniz:
  • n - aranan oluşumların tam sayısını belirten bir sayı
  • n, m - şu şekilde yorumlanan iki sayı: "en az n kez, ancak m'den fazla değil".
İşte ilk seçeneğin örnekleri:

$ yankı "tst" | awk "/te(1)st/($0 yazdır)" $ echo "deneme" | awk "/te(1)st/($0 yazdır)"

Kalıplarda kaşlı ayraçlar, tam oluşum sayısını bulma

awk'nin eski sürümlerinde, programın düzenli ifadelerdeki aralıkları tanıması için --re-interval komut satırı anahtarını kullanmanız gerekirken, daha yeni sürümlerde tanımazsınız.

$ yankı "tst" | awk "/te(1,2)st/(0 $ yazdır)" $ echo "deneme" | awk "/te(1,2)st/(0 $ yazdır)" $ echo "teest" | awk "/te(1,2)st/($0 yazdır)" $ echo "teeest" | awk "/te(1,2)st/($0 yazdır)"


Kıvrımlı parantez içinde verilen boşluk

Bu örnekte, "e" karakteri dizede 1 veya 2 kez geçmelidir, ardından normal ifade metne yanıt verecektir.

Kıvrımlı ayraçlar, karakter sınıflarıyla da kullanılabilir. Zaten aşina olduğunuz ilkeler burada geçerlidir:

$ yankı "tst" | awk "/t(1,2)st/($0 yazdır)" $ echo "deneme" | awk "/t(1,2)st/(yazdır $0)" $ echo "teest" | awk "/t(1,2)st/(yazdır $0)" $ echo "teeast" | awk "/t(1,2)st/($0 yazdır)"


Kıvrımlı parantezler ve karakter sınıfları

"a" karakteri veya "e" karakteri bir veya iki kez geçtiğinde şablon metne tepki verecektir.

▍Mantıksal “veya” sembolü

Sembol | - dikey çubuk, düzenli ifadelerde mantıksal bir "veya" anlamına gelir. Böyle bir karakterle ayrılmış birkaç parça içeren bir normal ifadeyi işlerken, motor, parçalardan herhangi biriyle eşleşirse ayrıştırılan metni bir eşleşme olarak kabul eder. İşte bir örnek:

$ echo "Bu bir testtir" | awk "/test|exam/(print $0)" $ echo "Bu bir sınav" | awk "/test|exam/(print $0)" $ echo "Bu başka bir şey" | awk "/test|exam/($0 yazdır)"


Normal ifadelerde Boole "veya"

Bu örnekte, normal ifade, metinde "test" veya "exam" sözcüklerini aramak üzere yapılandırılmıştır. Şablon parçaları ile onları ayıran | sembolü arasında olmasına dikkat edin. boşluk olmamalıdır.

Normal ifade parçaları parantezler kullanılarak gruplandırılabilir. Belirli bir karakter dizisini gruplandırırsanız, sistem tarafından normal bir karakter olarak algılanacaktır. Yani, örneğin, tekrar meta karakterleri ona uygulanabilir. İşte göründüğü gibi:

$ yankı "Beğen" | awk "/Like(Geeks)?/($0 yazdır)" $ echo "LikeGeeks" | awk "/Beğen(Geeks)?/($0 yazdır)"


Normal İfade Parçalarını Gruplama

Bu örneklerde, "Geeks" kelimesi parantez içine alınmış ve ardından bir soru işareti konmuştur. Soru işaretinin "0 veya 1 tekrar" anlamına geldiğini hatırlayın, sonuç olarak normal ifade hem "Like" hem de "LikeGeeks" dizesiyle eşleşecektir.

Pratik örnekler

Artık normal ifadelerin temellerini ele aldığımıza göre, onlarla yararlı bir şeyler yapmanın zamanı geldi.

▍Dosya sayısını sayma

PATH ortam değişkenine yazılan dizinlerde bulunan dosyaları sayan bir bash betiği yazalım. Bunu yapmak için önce dizinlere giden yolların bir listesini oluşturmanız gerekir. Bunu sed ile yapalım, iki nokta üst üsteleri boşluklarla değiştirelim:

$ yankı $PATH | sed "s/:/ /g"
Değiştirme komutu, metin aramak için kalıplar olarak normal ifadeleri destekler. Bu durumda, her şey son derece basit, iki nokta üst üste sembolü arıyoruz, ancak burada kimse başka bir şey kullanmaya zahmet etmiyor - hepsi belirli göreve bağlı.
Şimdi ortaya çıkan listeyi bir döngü içinde gözden geçirmemiz ve oradaki dosya sayısını saymak için gerekli işlemleri yapmamız gerekiyor. Komut dosyasının genel şeması aşağıdaki gibi olacaktır:

Mypath=$(echo $PATH | sed "s/:/ /g") $mypath içindeki dizin için bitti
Şimdi ls komutunu kullanarak her bir dizindeki dosya sayısı hakkında bilgi almak için betiğin tam metnini yazalım:

#!/bin/bash mypath=$(echo $PATH | sed "s/:/ /g") count=0 $mypath do check=$(ls $directory) $check içindeki öğe için do count=$ [ $count + 1 ] yapıldı yankı "$dizin - $count" sayımı=0 tamamlandı
Komut dosyasını çalıştırırken, PATH'deki bazı dizinlerin olmadığı ortaya çıkabilir, ancak bu, mevcut dizinlerdeki dosyaları saymasını engellemez.


dosya sayısı

Bu örneğin ana değeri, aynı yaklaşımı kullanarak çok daha karmaşık sorunları çözebilmenizdir. Hangisi ihtiyaçlarınıza bağlıdır.

▍E-posta adreslerini doğrulama

E-posta adreslerini, telefon numaralarını vb. kontrol etmenizi sağlayan çok sayıda normal ifade içeren web siteleri vardır. Bununla birlikte, hazır almak bir şeydir ve kendiniz bir şey yaratmak başka bir şeydir. O halde e-posta adreslerini doğrulamak için bir normal ifade yazalım. İlk verilerin analizi ile başlayalım. Örneğin, işte bir adres:

[e-posta korumalı]
Kullanıcı adı username , alfasayısal karakterlerden ve diğer bazı karakterlerden oluşabilir. Yani bu bir nokta, kısa çizgi, alt çizgi ve artı işaretidir. Kullanıcı adının ardından @ işareti gelir.

Bu bilgiyle donanmış olarak, normal ifadeyi, kullanıcı adını kontrol etmeye yarayan sol tarafından birleştirmeye başlayalım. İşte sahip olduklarımız:

^(+)@
Bu kurallı ifade şu şekilde okunabilir: "Satırın başında köşeli parantez içinde verilen gruptan en az bir karakter olmalı ve bundan sonra @ işareti olmalıdır."

Şimdi ana bilgisayar adı sırası - ana bilgisayar adı. Kullanıcı adıyla aynı kurallar burada da geçerlidir, dolayısıyla bunun şablonu şöyle görünür:

(+)
Üst düzey alan adı özel kurallara tabidir. Yalnızca en az iki (örneğin, bu tür alan adları genellikle bir ülke kodu içerir) ve en fazla beş olması gereken alfabetik karakterler olabilir. Bütün bunlar, adresin son bölümünü kontrol etme şablonunun şu şekilde olacağı anlamına gelir:

\.({2,5})$
Bunu şu şekilde okuyabilirsiniz: "Önce bir nokta olmalı, sonra - 2 ila 5 alfabetik karakter ve bundan sonra satır biter."

Düzenli ifadenin ayrı bölümleri için kalıpları hazırladıktan sonra, bunları bir araya getirelim:

^(+)@(+)\.({2,5})$
Şimdi sadece ne olduğunu test etmek için kalır:

$ yankı" [e-posta korumalı]" | awk "/^(+)@(+)\.((2,5))$/($0 yazdır)" $ echo " [e-posta korumalı]" | awk "/^(+)@(+)\.((2,5))$/($0 yazdır)"


Bir e-posta adresini normal ifadelerle doğrulama

awk'ye iletilen metnin ekranda görüntülenmesi, sistemin onu bir e-posta adresi olarak tanıdığı anlamına gelir.

Sonuçlar

Makalenin en başında tanıştığınız e-posta adreslerini kontrol etmek için kullanılan normal ifade o zaman tamamen anlaşılmaz göründüyse, artık anlamsız bir karakter kümesi gibi görünmediğini umarız. Bu doğruysa, bu materyal amacına hizmet etmiştir. Aslında, normal ifadeler hayatınız boyunca çalışabileceğiniz bir konudur, ancak analiz ettiğimiz çok az şey bile metinleri oldukça gelişmiş bir şekilde işleyen komut dosyaları yazmanıza yardımcı olabilir.

Bu materyal dizisinde, genellikle kelimenin tam anlamıyla birkaç satırdan oluşan bash betiklerinin çok basit örneklerini gösterdik. Bir dahaki sefere daha büyük bir şeye bakalım.

Sevgili okuyucular! Komut satırı komut dosyalarındaki metni işlerken normal ifadeler kullanıyor musunuz?

Bu eğitim hakkında

Linux Professional Institute'ta sizi Sınav 101'e hazırlamak için tasarlanmış dört eğitimden ikincisi olan Yönetimin Temelleri'ne hoş geldiniz. Bu bölümde, kalıplara dayalı olarak dosyalarda metin aramak için normal ifadelerin nasıl kullanılacağına bakacağız. Ardından, "Dosya Sistemi Hiyerarşi Standardı" (Dosya Sistemi Hiyerarşi Standardı veya kısaca FHS) ile tanışacaksınız ve ayrıca size sisteminizde ihtiyacınız olan dosyaları nasıl bulacağınızı göstereceğiz. Bundan sonra, arka planda çalıştırarak, süreçleri listeleyerek, terminalden ayırarak ve daha fazlasını yaparak Linux süreçlerinin tam kontrolünü nasıl alacağınızı öğreneceksiniz. Aşağıda ardışık düzenlere, yönlendirmelere ve metin işleme komutlarına hızlı bir giriş yer almaktadır. Son olarak, size Linux çekirdek modüllerini tanıtacağız.

Özellikle, eğitimin bu bölümü (Bölüm 2), hali hazırda bash hakkında iyi bir temel bilgiye sahip olanlar ve temel Linux yönetim görevlerine iyi bir giriş yapmak isteyenler için idealdir. Linux'ta yeniyseniz, önce bu nasıl yapılır serisinin ilk bölümünü tamamlamanızı öneririz. Bazıları için bu materyalin çoğu yeni olacak, ancak daha deneyimli Linux kullanıcıları bunu temel yönetim becerilerini özetlemek için harika bir yol bulabilir.



Bu eğitimin ilk sayısını LPI sınavına çalışmak dışında bir amaç için okuduysanız, bu sayıyı tekrar okumanıza gerek olmayabilir. Ancak, sınava girmeyi planlıyorsanız, eğitimin bu gözden geçirilmiş sürümünü yeniden okumanız şiddetle tavsiye edilir.

Düzenli ifadeler

"Normal ifade" nedir?

Bir normal ifade (İngilizce normal ifadeye göre, anavatandaki "regexp" veya "regex" kısaltmasına göre bazen "normal" - yaklaşık Şerit olarak adlandırılır), metin kalıplarını tanımlamak için kullanılan özel bir sözdizimidir. Linux sistemlerinde, normal ifadeler, metinde kalıp eşleştirme ve metin akışlarında arama ve değiştirme işlemleri için yaygın olarak kullanılır.

Globbing ile karşılaştırıldığında

Düzenli ifadelere bakmaya başladığımızda, sözdizimlerinin ilk bölümde incelediğimiz dosya adı globbing sözdizimine çok benzediğini fark edebilirsiniz. Ancak yanılmayın, bu benzerlik çok yüzeysel. Normal ifadeler ve genelleme kalıpları, benzer görünseler bile temelde farklı şeylerdir.

basit alt dize

Bu uyarıyı aradan çıkardıktan sonra, düzenli ifadelerle ilgili en temel şeye, en basit alt dizeye bakalım. Bunu yapmak için, bir dosyanın içeriğini belirli bir düzenli ifadeye göre tarayan bir komut olan "grep" kullanacağız. grep, normal ifadeyle eşleşen her satırı yazdırır, gerisini yok sayar:

$ grep bash /etc/şifre
operatör:x:11:0:operatör:/root:/bin/bash root:x:0:0::/root:/bin/bash ftp:x:40:1::/home/ftp:/bin/ darbe

Yukarıda, grep için ilk parametre normal ifadedir; ikincisi dosyanın adıdır. grep her satırı oku /etc/şifre ve bir eşleşme aramak için basit bir regex alt dizesi "bash" uyguladı. Bir eşleşme bulunursa grep tüm satırı yazdırır; Aksi takdirde, satır yoksayıldı.

Basit bir alt dizeyi anlama

Genel olarak, bir alt dize arıyorsanız, onu "özel" karakterler kullanmadan tam anlamıyla belirtebilirsiniz. Yalnızca alt dizeniz +, ., *, [, ] veya \ içeriyorsa özel dikkat göstermeniz gerekir; bu durumda bu karakterler ters eğik çizgi ile çıkarılmalı ve alt dize tırnak içine alınmalıdır. Basit bir alt dize olarak düzenli ifadelere bazı örnekler:

  • /tmp (/tmp satırını arayın)
  • "\" (dize arama)
  • "\*funny\*" (*funny* dizisini arayın)
  • "ld\.so" (ld.so dizisini arayın)

Meta karakterler

Metakarakter kullanan düzenli ifadeler ile son zamanlarda ele alınan örneklere göre çok daha karmaşık aramalar yapmak mümkündür. Böyle bir meta karakter "." (nokta), herhangi bir tek karakterle eşleşen:

$ grep dev.sda /etc/fstab
/dev/sda3 / reiserfs noatime,ro 1 1 /dev/sda1 /boot reiserfs noauto,noatime,notail 1 2 /dev/sda2 swap swap sw 0 0 #/dev/sda4 /mnt/extra reiserfs noatime,rw 1 1

Bu örnekte, dev.sda metni, kelimenin tam anlamıyla satırların hiçbirinde görünmüyor. /etc/fstab. Ancak, grep kelimenin tam anlamıyla dev.sda satırı için değil, dev.sda kalıbı için tarar. Bunu hatırla "." herhangi bir tek karakterle eşleşir. Gördüğünüz gibi, "." işlevsel olarak "?" meta karakterinin nasıl çalıştığına eşdeğerdir. glob ikamelerinde.

kullanım

Bir karakteri "."'den daha spesifik olarak belirtmek istiyorsak, eşleşen bir karakter alt kümesi belirtmek için [ ve ] (köşeli parantezler) kullanabiliriz:

$ grep dev.sda /etc/fstab
/dev/sda1 /boot reiserfs noauto,noatime,notail 1 2 /dev/sda2 takas takas sw 0 0

Gördüğünüz gibi, özellikle bu sözdizimsel yapı, glob dosya adı ikamesindeki "" yapıyla aynı şekilde çalışır. Yine, bu, düzenli ifadeleri öğrenmedeki belirsizliklerden biridir: sözdizimi, kafa karıştırıcı olan glob ikamelerine benzer, ancak aynı değildir.

[^] kullanılıyor

['den hemen sonra ^ koyarak köşeli parantezlerin anlamını tersine çevirebilirsiniz. Bu durumda, parantezler, içlerinde LİSTELENMEYEN herhangi bir karakterle eşleşecektir. Yine, normal ifadeyle [^] ve glob ile [!] kullandığımıza dikkat edin:

$ grep dev.hda[^12] /etc/fstab
/dev/hda3 / reiserfs noatime,ro 1 1 #/dev/hda4 /mnt/extra reiserfs noatime,rw 1 1

Farklı Söz Dizimi

Köşeli parantez içindeki sözdiziminin normal ifadenin geri kalanından temelde farklı olduğuna dikkat etmek çok önemlidir. Örneğin, "." köşeli parantezlerin içinde bu, köşeli parantezlerin "" ile eşleşmesini sağlar. kelimenin tam anlamıyla, yukarıdaki örnekteki 1 ve 2 gibi. Karşılaştırma için, "." köşeli parantezlerin dışına yerleştirilenler, "\" öneki olmadıkça bir meta karakter olarak yorumlanır. /etc/fstab'dan dev.sda satırını aşağıdaki gibi içeren satırları yazdırmak için bu gerçeğin avantajını kullanabiliriz:

$ grep dev[.]sda /etc/fstab

Ayrıca şunu da yazabiliriz:

$ grep "dev\.sda" /etc/fstab

Bu normal ifadeler muhtemelen satırlarınızın hiçbiriyle eşleşmiyor. /etc/fstab dosya.

Matematik sembolü *

Bazı meta karakterler kendi başlarına hiçbir şeyle eşleşmez, ancak önceki karakterin anlamını değiştirir. Böyle bir karakter, önceki karakterin sıfır veya daha fazla tekrarını eşleştirmek için kullanılan * (yıldız) karakteridir. Bunun, *'nın normal ifadelerde globbing'den farklı bir anlamı olduğu anlamına geldiğini unutmayın. İşte birkaç örnek ve düzenli ifade eşleştirmesinin glob ikamelerinden farklı olduğu durumlara özellikle dikkat edin:

  • ABC"abbbbc" ile eşleşir ancak "abqc" ile eşleşmez (glob ikamesi durumunda, her iki dizi de modelle eşleşir. Nedenini anlıyor musunuz?)
  • ABC"abc" ile eşleşir ancak "abbqbbc" ile eşleşmez (yine, glob ikamesiyle, model her iki dizeyle eşleşir)
  • ABC"ac" ile eşleşir ancak "cba" ile eşleşmez (globlama durumunda ne "ac" ne de "cba" modelle eşleşmez)
  • olmak"bqe" ve "be" ile eşleşir (glob ikamesi "bqe" ile eşleşir ancak "be" ile eşleşmez)
  • olmak"bccqqe" ile eşleşir, ancak "bccc" ile eşleşmez (globlama sırasında, model aynı zamanda birinciyle eşleşir, ikinciyle eşleşmez)
  • olmak"bqqcce" ile eşleşir ancak "cqe" ile eşleşmez (glob ikamesi ile aynı)
  • olmak"bbbeee"yi karşılar (ancak globbing durumunda değil)
  • .* herhangi bir dizeyle eşleşir (glob ikamesi yalnızca "." ile başlayan dizelerle eşleşir)
  • foo.*"foo" ile başlayan herhangi bir alt dizeyle eşleşir (glob ikamesi durumunda, bu model "foo" ile başlayan dört karakterle başlayan dizelerle eşleşir)

Bu nedenle, özetlemek gerekirse, "ac" dizgisi "ab*c" normal ifadesiyle eşleşir, çünkü yıldız ayrıca önceki ifadenin (b) sıfır kez tekrarlanmasına izin verir. Ve yine, düzenli ifadelerdeki * meta karakterinin, glob ikamelerindeki * karakterinden tamamen farklı yorumlandığını belirtmekte fayda var.

Satır başı ve sonu

Ayrıntılı olarak inceleyeceğimiz son meta karakterler, sırasıyla bir dizgenin başlangıcını ve sonunu eşleştirmek için kullanılan ^ ve $'dır. Normal ifadenizin başında ^ kullanarak, deseninizi satırın başına "eklersiniz". Aşağıdaki örnekte, # karakteriyle başlayan herhangi bir dizeyle eşleşen ^# normal ifadesini kullanıyoruz:

$ grep ^# /etc/fstab

#

Tam satır normal ifadeler

^ ve $, dizenin tamamıyla eşleşecek şekilde birleştirilebilir. Örneğin, aşağıdaki normal ifade, # ile başlayan ve "." ile biten dizeleri, aralarında rastgele sayıda karakter olacak şekilde eşleştirir:

$ grep "^#.*\.$" /etc/fstab
# /etc/fstab: statik dosya sistemi bilgisi.

Yukarıdaki örnekte, $ karakterinin kabuk tarafından yorumlanmasını önlemek için normal ifademizi tek tırnak içine aldık. Tek tırnak işaretleri olmasaydı, grep onu göremeden $ normal ifademizden kaybolurdu.

Yazarlar hakkında

Daniel Robbins

Daniel Robbins, Gentoo topluluğunun kurucusu ve Gentoo Linux işletim sisteminin yaratıcısıdır. Daniel, karısı Mary ve enerjik iki kızıyla New Mexico'da yaşıyor. Aynı zamanda Funtoo'nun kurucusu ve başkanıdır ve IBM DeveloperWorks , Intel Developer Services ve C/C++ Users Journal için birçok teknik makale yazmıştır.

Chris Houser

Chris Houser, bilgisayar bilimi ve matematik alanında lisans derecesi aldığı ABD, Indiana, Taylor Üniversitesi'nde yönetim ekibine katıldığı 1994 yılından beri UNIX savunucusudur. O zamandan beri web uygulamaları, video düzenleme, UNIX sürücüleri ve kriptografik güvenlik gibi çeşitli alanlarda çalıştı. Sentry Data Systems'te çalışıyor Chris ayrıca Gentoo Linux ve Clojure gibi birçok açık kaynak projesine katkıda bulunmuştur ve The Joy of Clojure'un ortak yazarıdır.

Aron Griffis

Eiron Griffis, son on yılını Hewlett-Packard için Tru64 için UNIX ağ sürücüleri, Linux güvenlik sertifikasyonu, Xen ve KVM sanallaştırması ve son olarak da HP ePrint platformu gibi projelerde çalışarak geçirdiği Boston bölgesinde yaşıyor. Aaron programlamadan boş zamanlarında bisiklet sürerken, sopalarla hokkabazlık yaparken veya Boston Red Sox profesyonel beyzbol takımı için tezahürat yaparken programlamanın sorunları üzerine kafa yormayı tercih ediyor.

grep, 'küresel düzenli ifade yazıcısı' anlamına gelir. grep, kullanıcı tanımlı metin içeren metin dosyalarından istediğiniz satırları çıkarır.

grep iki şekilde kullanılabilir - kendi başına veya akışlarla birlikte.

grep, desteklediği çok sayıda seçenek nedeniyle işlevsellik açısından çok zengindir, örneğin: bir dize deseni veya RegExp normal ifade kalıbı veya Perl tabanlı normal ifade kullanarak arama yapın.

Çeşitli işlevleri nedeniyle, grep aracı aşağıdakiler de dahil olmak üzere birçok seçeneğe sahiptir: egrep (Genişletilmiş GREP), fgrep (Sabit GREP), pgrep (İşlemGREP), rgrep (yinelemeli GREP) vesaire. Ancak bu varyantların orijinal grep'ten küçük farklılıkları vardır.

grep seçenekleri

$ grep -V grep (GNU grep) 2.10 Telif Hakkı (C) 2011 Free Software Foundation, Inc. GPLv3+ Lisansı

Grep yardımcı programında değişiklikler vardır: egrep (genişletilmiş normal ifadeleri işlerken), fgrep ($*^|()\ karakterlerini değişmez değer olarak, yani gerçek anlamda ele alarak), rgrep (yinelemeli arama etkinken).

    egrep, grep -E ile aynıdır

    fgrep, grep -F ile aynıdır

    rgrep, grep -r ile aynıdır

    grep [-b] [-c] [-i] [-l] [-n] [-s] [-v] kısıtlı_regex_BRE [dosya ...]

grep komutu, kaynak dosyalardaki satırları,strict_regular_expression tarafından verilen kalıba göre eşleştirir. Herhangi bir dosya belirtilmezse, standart girdi kullanılır. Tipik olarak, başarıyla eşleşen her satır standart çıktıya kopyalanır; birden fazla kaynak dosya varsa, bulunan dizenin önünde dosya adı bulunur. grep, kompakt, deterministik olmayan bir algoritma kullanır. Sınırlı normal ifadeler kalıp olarak kabul edilir (değerleri karakter dizileri olan ve sınırlı sayıda alfanümerik ve özel karakter kullanan ifadeler). ed'deki normal ifadelerle aynı anlama sahiptirler.

$, *, , ^, |, () ve \ karakterlerinden kabuğun yorumundan kaçmanın en kolay yolu,strict_regular_expression ifadesini tek tırnak içine almaktır.

Seçenekler:

B Bulunduğu blok numarasını her satırın önüne ekler. Bu, bağlama göre blok ararken yararlı olabilir (bloklar 0'dan numaralandırılmıştır). -c Yalnızca deseni içeren satır sayısını döndürür. -h Eşleşen dizgiyi içeren dosya adının asıl dizgiden önce yazdırılmasını engeller. Birden fazla dosya arasında arama yaparken kullanılır. -i Karşılaştırmalarda büyük/küçük harf durumunu yok sayar. -l Her satıra bir tane olmak üzere yalnızca eşleşen satırları içeren dosyaların adlarını yazdırın. Desen bir dosyanın birden çok satırında bulunursa, dosya adı tekrarlanmaz. -n Dosyadaki her satırın önüne kendi numarasını ekleyin (satırlar 1'den başlayarak numaralandırılır). -s Var olmayan veya okunamayan dosyaların raporlanmasını engeller. -v Desen içerenler dışındaki tüm satırları yazdır. -w İfadeyi, metakarakterlerle çevrelenmiş gibi bir sözcük olarak arar \< и \>.

grep --yardım

Kullanım: grep [SEÇENEK]… PATTERN [DOSYA]… Her DOSYA'da veya standart girişte PATTERN'i arayın. Varsayılan olarak, PATTERN basit bir normal ifadedir (BRE). Örnek: grep -i "hello world" menu.h main.c Bir normal ifade türü seçme ve yorumlama: -E, --extended-regexp PATTERN - genişletilmiş normal ifade (ERE) -F, --fixed-regexp PATTERN - dizeler sabit uzunlukta, yeni satırla ayrılmış -G, --basic-regexp PATTERN - basit normal ifade (BRE) -P, --perl-regexp PATTERN - Perl normal ifadesi -e, --regexp=PATTERN arama için PATTERN kullanın - f, --file=DOSYA, DOSYA'dan KALIP al -i, --ignore-case büyük/küçük harf farkını göz ardı et -w, --word-regexp PATTERN tüm sözcüklerle eşleşmelidir -x, --line-regexp PATTERN tüm satırla eşleşmelidir -z, - -null-data satır sonu karakteri olmayan boş baytlı ayrı dizeler -version sürüm bilgisini yazdırın ve çıkın --help bu yardımı gösterin ve --mmap'ten geriye dönük uyumluluk için çıkın, yok sayın Çıktı kontrolü: -m, --max- count=NUM belirtilen NUM ile eşleştikten sonra dur -b, --byte- bayt cinsinden ofset çıktı satırları ile birlikte ofset baskı -n, --line-number çıktı satırları ile birlikte satır numarasını yazdır --her satırdan sonra satır-arabelleğe alınmış tampon temizleme - H, --with-filename her eşleşme için dosya adını yazdır -h , --no-filename çıktıyı dosyaismi ile başlatma --label=LABEL standart girdi için dosya adı olarak ETİKET'i kullan -o, --only-matching yalnızca bir kısmını gösterir PATTERN ile eşleşen satır -q, --quiet, - -silent tüm normal çıktıyı bastırır --binary-files=TÜR ikili dosyayı TİP olarak ele alır: ikili, metin veya eşleşmesiz. -a, --text --binary-files=text ile aynı -I --binary-files=matchless ile aynı -d, --directories=ACTION dizinlerin nasıl işleneceği ACTION okunabilir (okunabilir), recurse ( yinelemeli) veya atla (atla). -D, --devices=ACTION aygıtların, FIFO'ların ve soketlerin nasıl kullanılacağı ACTION okunabilir veya atlanabilir -R, -r, --recursive --directories=recurse ile aynıdır --include=F_PATTERN yalnızca F_PATTERN altında eşleşen dosyaları işle --exclude=F_PATTERN, F_PATTERN ile eşleşen dosyaları ve dizinleri atla --exclude-from=FILE, DOSYA'daki kalıp dosyalarıyla eşleşen dosyaları atla --exclude-dir=PATTERN ile eşleşen PATTERN dizinleri atlanacak -L, - -eşleşmeyen dosyalar sadece yazdır Eşleşmesiz DOSYA adları -l, --eşleşen-dosyalar yalnızca -c ile eşleşen DOSYA adlarını yazdırır, --count yalnızca DOSYA başına eşleşen satır sayısını yazdırır -T, --ilk sekme hizalama sekmesi (gerekirse) -Z , --null DOSYA adından sonra bayt 0 yazdır Bağlam yönetimi: -B, --before-context=NUM önceki bağlamın NUM satırını yazdır -A, --after-context=NUM sonraki bağlamın NUM satırını yazdır -C, -- bağlam[=NUM] NUM bağlam satırı yazdır -NUM --context=NUM ile aynı --color[=WHEN], --colour[=WHEN] eşleşen satırları ayırt etmek için işaretçileri kullanır; WHEN her zaman (her zaman), asla (asla) veya auto (otomatik olarak) olabilir -U, --binary satırın sonundaki CR karakterlerini kaldırma (MSDOS) -u, --unix-byte-offsets ofset olarak verir değilse CR'ler (MSDOS) "egrep" yerine "grep -E" çalıştırması gerekiyor. "fgrep"in "grep -F" olması gerekiyordu. "egrep" veya "fgrep" olarak çalıştırmaktan kaçınılması en iyisidir. FILE verilmediğinde veya FILE - olduğunda standart girdi okunur. İkiden az dosya belirtilirse, -h varsayılır. Eşleşme bulunursa program çıkış kodu 0, değilse 1, hata oluşursa veya -q seçeneği belirtilmezse çıkış kodu 2 olur. Çevirideki hataları şuraya bildirin: GNU Grep ana sayfası: GNU programlarıyla çalışma konusunda yardım:

Düzenli ifadeler, birçok sorunu çözmek için kullanılabilen, kalıp eşleştirme, işleme ve dizeleri değiştirmeye yönelik çok güçlü bir araçtır. İşte ana olanlar:

  • Metin girişi kontrol ediliyor;
  • Bir dosyadaki metni bulun ve değiştirin;
  • Dosyaları toplu olarak yeniden adlandırın;
  • Apache gibi hizmetlerle etkileşim;
  • Bir diziyi bir kalıba karşı kontrol etme.

Bu tam bir liste değildir, normal ifadeler çok daha fazlasını yapmanızı sağlar. Ancak yeni kullanıcılar için, onları oluşturmak için özel bir dil kullanıldığından çok karmaşık görünebilirler. Ancak sağladığı güç göz önüne alındığında, her sistem yöneticisinin Linux düzenli ifadelerini bilmesi ve kullanabilmesi gerekir.

Bu yazıda, bu aracın tüm özelliklerini anlayabilmeniz için yeni başlayanlar için bash normal ifadelerini ele alacağız.

Normal ifadelerde iki tür karakter kullanılabilir:

  • normal harfler;
  • meta karakterler.

Normal karakterler, herhangi bir diziyi oluşturan harfler, sayılar ve noktalama işaretleridir. Tüm metinler harflerden oluşur ve bunları metinde istediğiniz konumu bulmak için normal ifadelerde kullanabilirsiniz.

Meta karakterler başka bir şeydir, düzenli ifadelere güç veren şeylerdir. Meta karakterlerle, tek bir karakter aramaktan çok daha fazlasını yapabilirsiniz. Karakter kombinasyonlarını arayabilir, dinamik sayıda karakter kullanabilir ve aralıkları seçebilirsiniz. Tüm özel karakterler iki türe ayrılabilir, bunlar sıradan karakterlerin yerini alan ikame karakterler veya bir karakterin kaç kez tekrarlanabileceğini gösteren işleçlerdir. Normal bir ifadenin sözdizimi şöyle görünür:

normal_sembol özel karakter_operatörü

wildcard_değiştirme özel karakter_operatörü

  • \ - gerçek özel karakterler ters eğik çizgi ile başlar ve noktalama işareti şeklinde özel bir karakter kullanmanız gerektiğinde de kullanılır;
  • ^ - satırın başlangıcını gösterir;
  • $ - satırın sonunu gösterir;
  • * - önceki karakterin 0 veya daha fazla kez tekrarlanabileceğini gösterir;
  • + - önceki karakterin bir veya daha fazla kez tekrarlanması gerektiğini belirtir;
  • ? - önceki karakter sıfır veya bir kez olabilir;
  • (N)- önceki karakterin kaç kez (n) tekrarlanacağını belirtir;
  • (n,n)- önceki karakter N'den n defaya kadar tekrar edilebilir;
  • . - satır besleme dışında herhangi bir karakter;
  • - parantez içinde belirtilen herhangi bir karakter;
  • x|y- x sembolü veya y sembolü;
  • [^ az]- parantez içinde belirtilenler dışında herhangi bir karakter;
  • - belirtilen aralıktaki herhangi bir karakter;
  • [^a-z]- aralıkta olmayan herhangi bir karakter;
  • \B- boşluklu bir sözcük sınırını belirtir;
  • \B- karakterin bir kelimenin içinde olması gerektiği anlamına gelir, örneğin, ux, uxb veya tuxedo ile eşleşir, ancak Linux ile eşleşmez;
  • \D- karakterin bir rakam olduğu anlamına gelir;
  • \D- rakamsız karakter;
  • \N- yeni satır karakteri;
  • \S- boşluk karakterlerinden biri, boşluk, sekme vb.
  • \S- boşluk dışında herhangi bir karakter;
  • \T- sekme karakteri;
  • \v- dikey sekme karakteri;
  • \w- alt çizgi dahil herhangi bir alfabetik karakter;
  • \W- alt çizgi dışında herhangi bir alfabetik karakter;
  • \uXXX- Unido sembolü.

Özel karakterin ardından geldiğini belirtmek için değişmez özel karakterlerden önce eğik çizgi kullanılması gerektiğine dikkat etmek önemlidir. Tersi de geçerlidir, normal bir karakter olarak eğik çizgi olmadan kullanılan özel bir karakter kullanmak istiyorsanız, o zaman bir eğik çizgi eklemeniz gerekir.

Örneğin, metinde 1+ 2=3 dizesini bulmak istiyorsunuz. Bu diziyi normal ifade olarak kullanırsanız hiçbir şey bulamazsınız çünkü sistem artıyı, öncekinin bir veya daha fazla kez tekrarlanması gerektiğini söyleyen özel bir karakter olarak yorumlar. Bu yüzden kaçılması gerekir: 1 \+ 2 = 3. Kaçış olmadan, normal ifademiz yalnızca 11=3 veya 111=3 dizesiyle eşleşir ve böyle devam eder. Eşitlerden önce tire koymanıza gerek yok çünkü bu özel bir karakter değil.

Normal İfade Örnekleri

Artık temel konuları ele aldığımıza ve her şeyin nasıl çalıştığını bildiğinize göre, geriye linux grep düzenli ifadeleri hakkında edinilen bilgileri pratikte pekiştirmek kalıyor. Çok kullanışlı iki özel karakter, bir satırın başlangıcını ve sonunu gösteren ^ ve $'dır. Örneğin, adı s ile başlayan tüm kullanıcıları sistemimize kaydettirmek istiyoruz. O zaman normal ifadeyi kullanabilirsiniz "^s". egrep komutunu kullanabilirsiniz:

egrep "^s" /etc/passwd

Satırdaki son karaktere göre satır seçmek istiyorsak $ kullanabiliriz. Örneğin, tüm sistem kullanıcılarını bir kabuk olmadan seçelim, bu tür kullanıcılar hakkındaki kayıtlar yanlış ile biter:

egrep "yanlış$" /etc/passwd

s veya d ile başlayan kullanıcı adlarını görüntülemek için şu ifadeyi kullanın:

egrep "^" /etc/şifre

Aynı sonuç "|" karakteri kullanılarak da elde edilebilir. İlk seçenek aralıklar için daha uygundur ve ikincisi daha çok sıradan veya / veya için kullanılır:

egrep "^" /etc/şifre

Şimdi adı üç karakter uzunluğunda olmayan tüm kullanıcıları seçelim. Kullanıcı adı iki nokta üst üste ile biter. İki nokta üst üste işaretinden önce üç kez tekrarlanması gereken herhangi bir alfabetik karakteri içerebileceğini söyleyebiliriz:

egrep "^\w(3):" /etc/passwd

sonuçlar

Bu makalede, Linux düzenli ifadelerini ele aldık, ancak bu sadece temel bilgilerdi. Biraz daha derine inerseniz, bu araçla çok daha ilginç şeyler yapabileceğinizi göreceksiniz. Düzenli ifadeleri öğrenmek için harcanan zamana kesinlikle değecektir.

Yandex'den düzenli ifadelerle ilgili dersin sonunda: