forked from nyucel/linuxessentials
-
Notifications
You must be signed in to change notification settings - Fork 2
/
bolum7.tex
187 lines (151 loc) · 17.3 KB
/
bolum7.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
\chapter{Düzenli İfadeler}
\label{chap:bolum7}
\paragraph{Amaçlar}
\begin{itemize}
\item Basit ve gelişmiş düzenli ifadeleri formüle edebilmek ve anlamak
\item grep programı ve egrep, fgrep varyasyonlarını öğrenmek
\end{itemize}
\paragraph{Önceden Bilinmesi Gerekenler}
\begin{itemize}
\item Linux, kabuk ve komutların temel bilgisine sahip olmak(önceki bölümlerden)
\item Dosya ve dizinleri yönetmek (Bölüm ~\ref{chap:bolum6})
\item Metin editörünü kullanmak (Bölüm ~\ref{chap:bolum3})
\end{itemize}
\begin{section}{Düzenli ifadeler: Temeller} \label{sec:bolum71}
Çoğu linux komutları metin işleme için kullanılır-“buna benzer bütün satırlara xyz yap” biçimindeki şablonlar ile tekrar tekrar karşılaşırız. Metin parçalarını, çoğunlukla dosyalardaki satırları tanımlamak için kullanılan çok güçlü bir araç, ”düzenli ifade”
\footnote{Bu bilgisayar bilimlerinden bir terimdir ve “harflerin“ birleşiminden, bir harf kümesi içindeki seçeneklerden ve bunların sınırsız tekrarından oluşan karakter dizisi kümelerinin davranış yöntemlerinden birini belirtir. Düzenli ifadeleri tanıyan yordamlar programlama dili derleyicileri gibi çoğu programın temel yapı taşlarıdır. Düzenli ifadeler Unix tarihinde çok erken ortaya çıkmışlardı; ilk Unix geliştiricilerinin çoğu bilgisayar bilimleri geçmişine sahipti, yani bu fikir onlara yabancı değildi.} olarak adlandırılır. İlk bakışta düzenli ifadeler kabuğun dosya ismi arama şablonlarına benzer görünür (Bölüm ~\ref{sec:bolum63}), fakat düzenli ifadeler farklı şekilde işler ve daha çok olanak sağlar.
Düzenli ifadeler, kendileri de düzenli ifadeler olarak nitelendirilen daha ilkel ifadelerden özyinelemeli olarak oluşturulur. En basit düzenli ifadeler harfler, rakamlar ve genel karakter kümesideki diğer karakterlerdir ve bunlar kendilerini temsil ederler. Örneğin ”a”, “a” karakteriyle eşleşen düzenli ifadedir. “abc” düzenli ifadesi, “abc” karakter dizisi ile eşleşir. Karakter sınıfları kabuk arama şablonlarına benzer şekilde tanımlanabilir; dolayısıyla “[a-e]” düzenli ifadesi, a’dan e’ye herhangi bir karakterle eşleşir ve “a[xy]b” düzenli ifadesi “axb” veya “ayb” ile eşleşir. Kabukta olduğu gibi aralıklar birleştirilebilir-“[A-Za-z]” düzenli ifadesi tüm büyük ve küçük harflerle eşleşir-ama bir aralığın tümleyeni biraz farklı şekilde oluşturulur:” [$ ^\wedge $abc]” düzenli ifadesi “a”, ”b” ve “c” dışındaki tüm karakterlerle eşleşir (kabukta “[!abc]” ile oluşturulur). Nokta “.” kabuk arama şablonundaki soru işaretine karşılık gelir, sadece 1 karakterle-bunun tek istisnası “\textbackslash n” karakteridir.-eşleşecektir. Bu yüzden “a.c”, “abc”, “a/c” gibi ifadelerle eşleşir ama aşağıdaki gibi birden çok satır yapısıyla eşleşmez.
\begin{verbatim}
a
c
\end{verbatim}
Çoğu program satır satır işlendiğinden ve çoklu satır yapılarını işlemek daha zor olacağından çoklu satır yapısına yer verilmez (bazen bunu yapma imkanı olsaydı güzel olmayacağını söylemiyoruz).
Kabuk arama şablonlarının her zaman bir dosya isminin başından başlayarak eşleşmesi gerekiyorken düzenli ifadelere dayanarak satırları seçen programlarda düzenli ifadenin satırın herhangi bir yeri ile eşleşmesi yeterlidir. Ancak bu kısıtlanabilir: Bir şapka karakteri (“$ ^\wedge $”) ile başlayan düzenli ifadeler yalnızca satır başında eşleşme yapar ve dolar (“\$”) işaretiyle biten bir ifade sadece satır sonunda eşleşme yapar. Her bir satırın sonundaki alt satır karakteri yoksayılır. Böylece “xyz” ile biten tüm satırları seçmek için “xyz\textbackslash n\$” yazmak zorunda kalmak yerine “xyz\$” kullanabilirsiniz.
Daha ciddi konuşursak “$ ^\wedge $” ve “\$” işaretleri sırasıyla satırın başlangıcındaki ve satırın sonunda yeni satır karakterinin hemen solundaki görünmez kavramsal karakterlerle eşleşir.
Son olarak, “*” kendisinden önce gelen düzenli ifadenin isteğe göre defalarca tekrar edilebileceğini (veya hiç kullanılmayabileceğini) göstermek için kullanılabilir. Yıldızın kendisi girdideki hiçbir karakterin yerine geçmez ama sadece kendisinden önce gelen ifadeyi değiştirir-sonuç olarak kabuk arama şablonu “a*.txt”, “$ ^\wedge $a.*\textbackslash \textbackslash.txt ” düzenli ifadesine karşılık gelir (burada düzenli ifadenin başlangıcında ve girdi satırının sonunda “anchoring” olduğunu ve kaçırılmamış nokta karakterinin herhangi bir karakterle eşleştiğini hatırlayın). Tekrarlama birleştirmeden daha önceliklidir;” ab*” bir “a”nın peşinden gelen bir veya daha fazla (veya hiç) “b”yi ifade eder , ”ab”nin birden fazla sayıda tekrarı olmaz.
\begin{subsection}{Düzenli İfadeler: Ekstralar} \label{sec:bolum711}
Bir önceki bölümdeki açıklamalar düzenli ifadeler kullanan neredeyse tüm Linux programları için geçerlidir. Birçok program ilave işlevsellik veya gösterim kolaylığı sağlayan farklı eklentileri destekler. En iyi gerçekleştirimler, şu an Tcl, Perl, Python gibi modern betik dilleri içinde bulunur. Bu dillerin gerçekleştirimleri bilgisayar bilimlerinde kullanılan özgün düzenli ifadelerin gücünü şimdiye kadar aşmıştır.
Bazı yaygın eklentiler:
\paragraph{Kelime ayıraçları}{“\textbackslash $<$” bir kelimenin başı (harf olmayan bir karakterin harften önce geldiği yer) ile eşleşir. Benzer olarak, “\textbackslash$>$” kelimenin sonu (harf olmayan bir karakterin bir harfi takip ettiği yer) ile eşleşir.}
\paragraph{Gruplama}{Parantezler “((\ldots))” düzenli ifadelerin birleşiminin tekrarına izin verir. “a(bc)*” ifadesi “a”dan sonra “bc”nin bir veya daha fazla tekrarı ile eşleşir.}
\paragraph{Alternatif}{Dikey çubukla (“$\vert$”) birden çok düzenli ifade arasından seçim yapılabilir. “hava(alanı$\vert$limanı$\vert$sahası)” ifadesi, “havalimanı”, “havasahası” ve “havaalanı” ile eşleşebilir. Fakat tek başına “hava” ile eşleşmez.}
\paragraph{Seçimli ifadeler}{soru işareti (“?”) düzenli ifadelerin seçimli olmasını sağlar, yani ya bir kez geçer ya da hiç geçmez. “uçak(savar)?” ifadesi ya “uçak” ya da “uçaksavar” ile eşleşir.}
\paragraph{En az bir tekrar}{(“+”) işareti önceki düzenli ifadenin en az bir kez geçmek zorunda olması haricinde (“*”) operatörü ile tamamen aynıdır.}
\paragraph{Belirli tekrar sayıları}{Kıvrık parantezler içinde en az ve en çok tekrar sayılarını belirtebilirsiniz. “ab\{2,4\}” ifadesi “abb”,”abbb” ve “abbbb” ifadeleri ile eşleşir ama “ab” yada “abbbbbb” ifadeleri ile eşleşmez. En az veya en çok sayıyı es geçebilirsiniz. En az sayı yoksa 0 kabul edilir, en çok sayı yoksa “sonsuz” kabul edilir.}
\paragraph{Geri-referans}{“\textbackslash \textbackslash n” benzeri bir ifadeyle girdinin düzenli ifade içindeki ”n”inci sayılı parantez içindeki ifade ile eşleşen parçasını belirtebilirsiniz. Mesela “(ab)\textbackslash \textbackslash 1” ifadesi “abab” ile eşleşir. “(ab*a)x\textbackslash 1” ifadesini işlerken parantezler “abba” ile eşleştiyse tüm ifade “abbaxabba” ile eşleşir (başka hiçbirşeyle eşleşmez). Daha fazla ayrıntı GNU grep’in dökümanları içinde mevcuttur.}
\paragraph{Aç gözlü olmayan (eşleşme):}{“*” , “+” ve “?” operatörleri genellikle açgözlüdür, yani mümkün olduğunca çok sayıda girdiyle eşleşmeye çalışırlar: ”$ ^\wedge $a.*a” ifadesi “abacada” giriş karakter dizisine uygulandığında “aba” yada “abaca” ile değil, “abacada” ile eşleşir. Ancak aynı operatörlerin açgözlü olmayan uyarlamaları da vardır. “*?” ,”+?” ve “??” girdinin mümkün olduğu kadar azıyla eşleşmeye çalışırlar. Örneğimizde “a.*?a” , “aba” ile eşleşebilir. Kıvrık parantez operatörü de aç gözlü olmayan uyarlama sağlayabilir.}
Her program her eklentiyi desteklemez. Tablo ~\ref{tab:7.1} bazı önemli programları kısaca gösterir. Emacs, Perl ve Tcl burada tartışılmayan bir çok eklentiyi destekler.
\begin {table}[htb]\footnotesize
\caption {Düzenli İfade Desteği} \label{tab:7.1}
\begin{tabular}{l*{7}{c}}
\hline
Eklenti & GNU Grep & GNU egrep & trad egrep & vim & emacs & Perl & Tcl \\
\hline
Kelime ayıraçları & \textbullet & \textbullet & \textbullet & \textbullet$^1$ & \textbullet$^1$ & \textbullet$^4$ & \textbullet$^4$ \\
Gruplama & \textbullet$^1$ & \textbullet & \textbullet & \textbullet$^1$ & \textbullet$^1$ & \textbullet & \textbullet \\
Alternatif & \textbullet$^1$ & \textbullet & \textbullet & \textbullet$^2$ & \textbullet$^1$ & \textbullet & \textbullet \\
Seçimli ifadeler & \textbullet$^1$ & \textbullet & \textbullet & \textbullet$^3$ & \textbullet & \textbullet & \textbullet \\
En az bir tekrar & \textbullet$^1$ & \textbullet & \textbullet & \textbullet$^1$ & \textbullet & \textbullet & \textbullet \\
Sınırlar & \textbullet$^1$ & \textbullet & \textordmasculine & \textbullet$^1$ & \textbullet$^1$ & \textbullet & \textbullet \\
Geri-referans & \textordmasculine & \textbullet & \textbullet & \textordmasculine & \textbullet & \textbullet & \textbullet \\
Aç gözlü olmayan eşleşme & \textordmasculine & \textordmasculine & \textordmasculine & \textbullet$^4$ & \textbullet & \textbullet & \textbullet \\
\hline
\multicolumn{8}{l}{$^1$Kendinden önce “\textbackslash” işareti gelmelidir, örn: “ab+” yerine “ab\textbackslash+”.} \\
\multicolumn{8}{l}{$^2$Parantez kullanımı gerekmez, alternatifler daima tüm ifadeye aittir.} \\
\multicolumn{8}{l}{$^3$“?” yerine “\textbackslash=” kullanılır.} \\
\multicolumn{8}{l}{$^4$Sözdizimi tamamen farklıdır (kendi dökümanlarına başvurun).} \\
\end{tabular}
\end {table}
\end{subsection}
\end{section}
\begin{section}{Dosya içinde metin arama – grep}
Düzenli ifadelerin kullanıldığı en önemli Linux programlarından biri grep’tir. Verilen düzenli ifade ile eşleşen metinleri bir veya daha fazla dosya içindeki satırlarda arar. Eşleşen satırlar çıktı olarak verilir, eşleşmeyenler atılır.
Grep’in iki çeşidi vardır. Geleneksel olarak sadeleştirilmiş fgrep (“fixed (sabit)”) düzenli ifadelere izin vermez-karakter dizileri ile sınırlıdır- ama çok hızlıdır. egrep (“extended (genişletilmiş)”) ek düzenli ifade operatörlerine izin verir ama biraz daha yavaştır ve daha fazla hafızaya ihtiyaç duyar.
Bu gözlemler bir dereceye kadar doğru olabilir. Özel olarak grep ve egrep düzenli ifadeleri değerlendirmek için tamamiyle farklı algoritmalar kullanır. Bu da girdinin büyüklüğüne ve düzenli ifadenin yapısına ve boyutuna bağlı olarak çok farklı performans sonuçlarına yol açar. Yaygın Linux dağıtımlarında grep'in 3 çeşidi de aslında aynı programdır; arama şablonları için izin verdikleri söz dizimiyle ayrılırlar.
grep’in sözdizimi, aramak için en az bir düzenli ifade ister. Bunu, içinde arama yapılacak metin dosyasının veya dosyalarının isimleri izler. Eğer hiç dosya ismi belirtilmemişse grep standart girdiye başvurur (Bölüm ~\ref{chap:bolum8}’e bakın).
Girdi içerisinde aranacak düzenli ifade Bölüm ~\ref{sec:bolum71}’deki temel düzenli ifadelerin yanında Bölüm ~\ref{sec:bolum711}'deki gelişmiş düzenli ifadelerin çoğunu da içerebilir. Ancak grep ile “\textbackslash +”,”\textbackslash ?” ve “\textbackslash \{” operatörlerinden önce ters bölü gelmelidir. (egrep için bu gerekli değildir.) Maalesef hiç aç gözlü olmayan operatör yoktur.
Eğer düzenli ifade kabuk arama şablonuna benziyorsa ve tek bir karakter dizisinden daha karmaşıksa kabuğun düzenli ifadeyi genişletmeye çalışmasını önlemek için düzenli ifadeleri tek tırnak içine almalısınız.
Düzenli ifade ve dosya isimlerinden başka komut satırına çeşitli seçenekler geçilebilir. (Tablo ~\ref{tab:7.2}’ye bakın.)
\begin {table}[htb]
\caption {grep ile kullanılabilecek seçenekler} \label{tab:7.2}
\begin{tabular}{c r l}
\hline
{} & Seçenek & Sonuç\\
\hline
-c & (sayı) & Eşleşen satırların sayısını verir.\\
-i & (yoksayma) & Küçük ve büyük harfler eşittir.\\
-l & (listeleme) & Eşleşen satırları değil, eşleşen dosyaların isimlerini yazdırır.\\
-n & (sayı) & Çıktıda eşleşen satırların numaralarını verir.\\
-r & (özyinelemeli) & alt dizinlerdeki dosyaları da arar.\\
-v & (ters çevir) & Sadece düzenli ifadeyle eşleşmeyen satırları yazdırır.\\
\hline
\end{tabular}
\end {table}
-f (“dosya”) seçeneğiyle arama şablonu bir dosyadan okunabilir. Eğer verilen dosya birden çok satır içeriyorsa her satır kendi başına eşzamanlı olarak aranacak bir arama şablonu olarak değerlendirilecektir. Bu, özellikle sık kullanılan arama şablonlarının kullanımını oldukça basitleştirir.
Yukarıda bahsedildiği gibi fgrep arama şablonu olarak düzenli ifadelerin kullanılmasına izin vermez. Öte yandan egrep düzenli ifadeler için çoğu eklentinin kullanımına izin verir (Tablo ~\ref{tab:7.1}).
Son olarak grep için bazı örnekler. frog.txt dosyası Grimm Kardeşler'in peri masalı Kurbağa Kral'ı içerir. (Ek ~\ref{app:B}’ye bakın). frog karakter serisini içeren tüm satırlar en kolay şöyle bulunur.
\footnotesize
\begin{verbatim}
$ grep frog frog.txt
Frog stretching forth its big, ugly head from the water. >>Ah,old
>>Be quiet, and do not weep,<< answered the frog, >> I can help you, but
>>Whatever you will have, dear frog,<<said she,>>My clothes,my pearls
\end{verbatim}
\normalsize
Açıkça sadece “frog” kelimesini (“bullfrog” veya “frogspawn” gibi varyasyonlarını bulmayacak) aramak için kelime ayıracı eklentisi kullanılmalıdır:
\footnotesize
\begin{verbatim}
$ grep \<frog\> frog.txt
frog stretching forth its big, ugly head from the water. >> Ah, old
\end{verbatim}
\normalsize
(Bunun İngilizce olması farketmez. Dil ne olursa olsun “frog” geçen her satır gösterilir) “frog” ile \textit{başlayan} satırları göstermek aşağıdaki kadar basittir:
\footnotesize
\begin{verbatim}
$ grep ^frog frog.txt
frog stretching forth its big, ugly head from the water. >> Ah, old
frog, that he had caused three iron bands to be laid roun his heart,
\end{verbatim}
\normalsize
Farklı bir örnek: \verb|/usr/share/dict/words| dosyası ingilizce kelimelerin bir listesini içerir (genellikle “sözlük“ \footnote{Sözlüğün boyutu kullanılan dağıtıma göre oldukça farklı olabilir} olarak adlandırılır) Burada üç veya daha fazla “a” içeren tüm kelimeleri arıyoruz:
\footnotesize
\begin{verbatim}
$ grep –n ‘a.*a.*a’ /usr/share/dict/words
8:aardvark
21:abaca
22:abacate
..(7030 kelime gizlendi)...
234831:zygomaticoaruricularis
234832:zygomaticofacial
234834:zygomaticomaxillary
\end{verbatim}
\normalsize
(sırasıyla: bir afrika hayvanı (orycteropus afer), iplik yapımında kullanılan muz ağacı (musa textilis), avokadonun Brezilyacası (perse sp.), bir yüz kası, iki tıbbi sıfat)
Daha karmaşık düzenli ifadelerle birlikte grep'in neden bir satırı yazdırıp diğerini yazdırmadığı çabucak belirsizleşebilir. Bir dosyadaki eşleşen parçaların farklı renkte gösterilmesini sağlayan -{}-color seçeneği kullanılarak bu belirsizlik bir dereceye kadar azaltılabilir.
\footnotesize
\begin{verbatim}
$ grep --color root /etc/passwd
root:x:0:0:root:/root:/bin/bash
\end{verbatim}
\normalsize
\verb|export GREP\_OPTIONS='--color=auto'| benzeri bir komut (örneğin $\sim$/.profile dosyası içinde) bu seçeneği kalıcı olarak etkinleştirir; auto argümanı eğer çıktı bir boruya veya dosyaya gönderilirse renk çıktısını gizler.
\paragraph{{\Huge{\PencilLeftDown}}Alıştırmalar}{
\begin{enumerate}
\item ”?” ve “+” düzenli ifade operatörleri gerçekten gerekli midir?
\item \verb|frog.txt| dosyası içinde “king” veya ”king’s daughter” kelimelerini içeren satırları bulun.
\item \verb|/etc/passwd| içinde sistem üzerindeki kullanıcıların listesi vardır. Dosyanın her bir satırı ”:” karakteri ile ayrılmış sıralı alanlardan oluşur. Her satırdaki son alan o kullanıcının giriş kabuğunu verir. Giriş kabuğu olarak bash kullanan bütün kullanıcıları listeleyen grep komut satırı yazın.
\item \verb|/usr/share/dict/words| dosyası içinde şu 5 sesli harfi “a”,”e”,”i”,”o” ve “u” sırasıyla (önünde, aralarında ve sonunda sessiz harfler olabilir) içeren kelimeleri arayın.
\item \verb|frog.txt| dosyasında en az 4 harfli kelimelerin iki defa geçtiği satırları yazdıran bir komut verin.
\end{enumerate}}
\paragraph{Bu bölümdeki komutlar}{
\begin{itemize}
\item[egrep]Belirli düzenli ifadelerle eşleşen satırlar için dosyaları arar. Genişletilmiş düzenli ifadelere izin verir.
\item[fgrep]Belirli içerikte satırlar için dosyaları arar. Düzenli ifadeler kullanılamaz.
\item[grep]Verilen düzenli ifadeyle eşleşen satırlar için dosyaları arar.
\end{itemize}}
\paragraph{Özet}{
\begin{itemize}
\item Düzenli ifadeler karakter dizilerinin kümelerini tanımlamak için çok güçlü bir yöntemdir.
\item \verb|grep| ve ailesi düzenli ifadelerle eşleşen satırlar için bir dosyanın içeriğini arar.
\end{itemize}}
\end{section}