Android

Linux'ta Grep komutu (dosyalarda metin bul)

Linux vs Windows vs MacOS для работы. Какой ЛИНУКС выбрать в 2020 для рабочего компьютера?

Linux vs Windows vs MacOS для работы. Какой ЛИНУКС выбрать в 2020 для рабочего компьютера?

İçindekiler:

Anonim

“Global düzenli ifade baskısı” anlamına gelen grep komutu, Linux'ta en güçlü ve yaygın olarak kullanılan komutlardan biridir.

Grep, bir veya daha fazla girdi dosyasında belirli bir desenle eşleşen satırları arar ve eşleşen her satırı standart çıktıya yazar. Hiçbir dosya belirtilmezse, grep genellikle başka bir komutun çıktısı olan standart girişten okur.

Bu öğreticide, pratik örnekler ve en yaygın GNU grep seçeneklerinin ayrıntılı açıklamaları ile grep komutunun nasıl kullanılacağını göstereceğiz.

Grep Komut Sözdizimi

grep komutunun nasıl kullanılacağına başlamadan önce, temel sözdizimini inceleyerek başlayalım.

grep yardımcı programı ifadeleri aşağıdaki formu alır:

grep PATTERN

Köşeli parantez içindeki öğeler isteğe bağlıdır.

  • OPTIONS - Sıfır veya daha fazla seçenek. Grep, davranışını kontrol eden bir dizi seçenek sunar. PATTERN - Arama modeli. FILE - Sıfır veya daha fazla girdi dosyası adı.

Dosyayı arayabilmek için, komutu çalıştıran kullanıcının dosyaya okuma erişimi olmalıdır.

grep dosyalarda bir dize aramak için nasıl kullanılır

grep komutunun en temel kullanımı bir dosyada dize (metin) aramaktır.

Örneğin, bash dizesini içeren /etc/passwd dosyasındaki satırları görüntülemek için aşağıdaki komutu kullanabilirsiniz:

grep bash /etc/passwd

Çıktı şöyle görünmelidir:

root:x:0:0:root:/root:/bin/bash linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Dize boşluk içeriyorsa, tek veya çift tırnak işaretleri içine almanız gerekir:

grep "Gnome Display Manager" /etc/passwd

Eşleşmeyi Ters Çevir (Hariç Tut)

Bir kalıpla eşleşmeyen çizgileri görüntülemek için -v (veya --invert-match ) seçeneğini kullanın.

Örneğin, /etc/passwd dosyasındaki nologin dizesini içermeyen satırları görüntülemek için aşağıdaki komutu kullanabilirsiniz:

grep -v nologin /etc/passwd

root:x:0:0:root:/root:/bin/bash colord:x:124:124::/var/lib/colord:/bin/false git:x:994:994:git daemon user:/:/usr/bin/git-shell linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Komut Çıktısında Dize Aramak İçin Grep Nasıl Kullanılır

Giriş dosyalarını belirtmek yerine, başka bir komutun çıktısını grep ve daha sonra yalnızca belirli bir desenle eşleşen satırları görüntüleyebilirsiniz.

Örneğin, sisteminizde kullanıcı www-data olarak hangi işlemlerin çalıştığını bulmak için aşağıdaki ps komutunu kullanabilirsiniz:

ps -ef | grep www-data

www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process

Komutla çoklu boruları da zincirleyebilirsiniz. Yukarıdaki çıktıda görebileceğiniz gibi, grep sürecini içeren bir çizgi de vardır. Bu satırın gösterilmesini istemiyorsanız, çıktıyı aşağıda gösterildiği gibi başka bir grep örneğine grep .

ps -ef | grep www-data | grep -v grep

www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process

Yinelemeli Arama

Bir kalıbı özyinelemeli olarak aramak için, -r seçeneğini (veya --recursive ) kullanın. Bu, yinelenen bir şekilde karşılaşılan sembolik bağlantıları atlayarak belirtilen dizindeki tüm dosyaları arar. Tüm sembolik bağlantıları takip etmek için -R seçeneğini (veya --dereference-recursive ) kullanın.

Aşağıdaki örnekte, /etc dizini içindeki tüm dosyalarda linuxize.com dizesini linuxize.com :

grep -r linuxize.com /etc

Komut, dosyanın tam yolu tarafından önekle eşleşen eşleşen satırları yazdırır.

/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com;

Bunun yerine -r seçeneğini kullanırsanız -R seçeneği grep tüm sembolik bağlantıları izler:

grep -R linuxize.com /etc

Çıktının son satırına dikkat edin. Nginx'in sites-enabled dizindeki dosyalar, sites-available dizinin içindeki yapılandırma dosyalarına sembolik olduğundan, bu örnek yukarıdaki örnekte basılmamıştır.

/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com; /etc/nginx/sites-enabled/linuxize.com: server_name linuxize.com www.linuxize.com;

Yalnızca Dosya Adını Göster

Varsayılan grep çıktısını bastırmak ve yalnızca eşleşen deseni içeren dosyaların adlarını yazdırmak için -l (veya - --files-with-matches ) seçeneğini kullanabilirsiniz.

Örneğin, geçerli çalışma dizininde .conf ile biten tüm dosyaları aramak ve yalnızca linuxize.com türünü içeren dosyaların adlarını yazdırmak için:

grep -l linuxize.com *.conf

Çıktı şöyle görünecektir:

tmux.conf haproxy.conf

-l seçeneği genellikle -R özyinelemeli seçenekle birlikte kullanılır:

grep -Rl linuxize.com /tmp

Büyük / Küçük Harfe Duyarsız Arama

Varsayılan olarak, grep komutu büyük / küçük harfe duyarlıdır. Bu, büyük ve küçük harf karakterlerine farklı davranıldığı anlamına gelir.

Arama yaparken büyük / küçük harfleri yoksaymak için -i seçeneğini (veya --ignore-case ) kullanın.

Örneğin, herhangi bir seçenek olmadan Zebra ararken, aşağıdaki komut herhangi bir çıktı göstermez, yani eşleşen satırlar vardır:

grep Zebra /usr/share/words

Ancak, -i seçeneğini kullanarak büyük / küçük harf duyarlı olmayan bir arama yaparsanız, hem büyük hem de küçük harflerle eşleşir:

grep -i Zebra /usr/share/words

“Zebra” belirtilmesi, “zebra”, “ZEbrA” ya da o dizenin büyük ve küçük harflerinin herhangi bir kombinasyonuyla eşleşir.

zebra zebra's zebras

Tam Kelimeleri Arama

“Gnu” ararken, grep ayrıca “gnu” nun “cygnus” veya “magnum” gibi daha büyük sözcüklerle gömülü olduğu satırları da yazdıracaktır.

grep gnu /usr/share/words

cygnus gnu interregnum lgnu9d lignum magnum magnuson sphagnum wingnut

Yalnızca belirtilen dizenin tam bir kelime olduğu satırları döndürmek için (sözcük olmayan karakterlerle çevrelenir), -w (veya --word-regexp ) seçeneğini kullanın.

Kelime karakterleri alfasayısal karakterleri ( az , AZ ve 0-9 ) ve alt çizgileri ( _ ) içerir. Diğer tüm karakterler sözcük olmayan karakterler olarak kabul edilir.

grep -w gnu /usr/share/words

gnu

Satır Numaralarını Göster

Bir kalıpla eşleşen bir dize içeren satırların sayısını göstermek için -n (veya --line-number ) seçeneğini kullanın. Bu seçenek kullanıldığında, grep , eşleşmeleri bulunduğu satır numarasının önüne eklenmiş standart çıktıya yazdıracaktır.

Örneğin, /etc/services dosyasından eşleşen satır numarası ile ön ekli bash dizesini içeren satırları görüntülemek için aşağıdaki komutu kullanabilirsiniz:

grep -n 10000 /etc/services

Aşağıdaki çıktı, eşleşmelerin 10423 ve 10424 satırlarında bulunduğunu göstermektedir.

10423:ndmp 10000/tcp 10424:ndmp 10000/udp

Maçları Say

Standart çıkışa uygun sayıda satır yazdırmak için -c (veya --count ) seçeneğini kullanın.

Aşağıdaki örnekte, /usr/bin/zsh olan hesapların sayısını kabuk olarak sayıyoruz.

grep -c '/usr/bin/zsh' /etc/passwd

4

Birden Çok Dizgiyi Arama (Desenler)

OR operatörü | .

Varsayılan olarak grep , kalıbı | gibi meta karakterlerin bulunduğu temel bir normal ifade olarak yorumlar. özel anlamlarını yitirir ve ters eğik sürümleri kullanılmalıdır.

Aşağıdaki örnekte Nginx günlük hatası dosyasında fatal , error ve critical kelimelerin tüm örneklerini araştırıyoruz:

grep 'fatal\|error\|critical' /var/log/nginx/error.log

grep -E 'fatal|error|critical' /var/log/nginx/error.log

Sessiz mod

-q (veya --quiet ) --quiet terminale bir şey --quiet söyler (standart çıktı). Bir eşleşme bulunursa, komut 0 durumuyla çıkar. Bu, bir dosyanın bir dize içerip içermediğini kontrol etmek ve sonuca bağlı olarak belirli bir eylemi gerçekleştirmek istediğiniz kabuk komut dosyalarında grep kullanırken yararlıdır.

Aşağıda, if ifadesinde bir test komutu olarak sessiz modda grep kullanma örneği:

if grep -q PATTERN filename then echo pattern found else echo pattern not found fi

Temel Düzenli İfade

GNU Grep, Temel ve Genişletilmiş olmak üzere iki normal ifade özellik kümesine sahiptir. Varsayılan olarak grep , kalıbı temel bir normal ifade olarak yorumlar.

Temel normal ifade modunda kullanıldığında, meta karakterler dışındaki diğer tüm karakterler aslında kendileriyle eşleşen normal ifadelerdir. Aşağıda en sık kullanılan meta karakterlerin bir listesi verilmiştir:

  • Satırın başlangıcındaki ifadeyle eşleştirmek için ^ (düzeltme) sembolünü kullanın. Aşağıdaki örnekte, ^kangaroo dizesi yalnızca bir satırın en başında gerçekleşirse eşleşir.

    grep "^kangaroo" file.txt

    Satırın sonundaki ifadeyle eşleşmek için $ (dolar) sembolünü kullanın. Aşağıdaki örnekte, kangaroo$ dizesi yalnızca satırın en sonunda gerçekleşirse eşleşir.

    grep "kangaroo$" file.txt

    Kullanın . (nokta) sembolü. Örneğin, kan ile başlayan ve iki karakter içeren ve dize roo ile biten herhangi bir şeyi eşleştirmek için aşağıdaki deseni kullanabilirsiniz:

    grep "kan..roo" file.txt

    kullanım (köşeli parantez), köşeli parantez içindeki herhangi bir tek karakterle eşleşecek şekilde. Örneğin, accept veya “ accent içeren satırları bulun, aşağıdaki deseni kullanabilirsiniz:

    grep "accet" file.txt

    kullanım (köşeli parantez), köşeli parantez içindeki herhangi bir tek karakterle eşleşecek şekilde. Aşağıdaki desen, coca , cobalt vb. Gibi co(any_letter_except_l)a içeren herhangi bir dizgi kombinasyonuyla eşleşir, ancak cola içeren satırlarla eşleşmez, grep "coa" file.txt

Bir sonraki karakterin özel anlamından kaçmak için \ (ters eğik çizgi) sembolünü kullanın.

Genişletilmiş Düzenli İfadeler

Deseni genişletilmiş normal ifade olarak yorumlamak için -E (veya --extended-regexp ) seçeneğini kullanın. Genişletilmiş düzenli ifadeler, tüm temel meta karakterlerin yanı sıra daha karmaşık ve güçlü arama kalıpları oluşturmak için ek meta karakterleri içerir. Aşağıda bazı örnekler verilmiştir:

  • Belirli bir dosyadaki tüm e-posta adreslerini eşleştirin ve çıkarın:

    grep -E -o "\b+@+\.{2, 6}\b" file.txt

    Belirli bir dosyadaki tüm geçerli IP adreslerini eşleştirin ve çıkarın:

    grep -E -o '(25|2|??)\.(25|2|??)\.(25|2|??)\.(25|2|??)' file.txt

-o seçeneği yalnızca eşleşen dizeyi yazdırmak için kullanılır.

Maçtan Önce Satırları Yazdır

Çizgileri eşleştirmeden önce belirli sayıda satırı yazdırmak için -B (veya --before-context ) seçeneğini kullanın.

Örneğin, satırları eşleştirmeden önce beş satır ara bağlamı görüntülemek için aşağıdaki komutu kullanırsınız:

grep -B 5 root /etc/passwd

Maçtan Sonra Satırları Yazdır

Satırları eşleştirdikten sonra belirli sayıda satırı yazdırmak için -A (veya --after-context ) seçeneğini kullanın.

Örneğin, satırları eşleştirdikten sonra beş satır sonu bağlamı görüntülemek için aşağıdaki komutu kullanırsınız:

grep -A 5 root /etc/passwd

Sonuç

grep komutu, dosyaların içinde bir desen aramanıza olanak tanır. Bir eşleşme bulunursa, grep belirtilen deseni içeren satırları yazdıracaktır.

Grep Kullanım Kılavuzu sayfasında Grep hakkında öğrenilecek çok şey var.

grep terminali