Açıklamalı grep Örnekleri

grep sayesinde, dosya(lar) içerisinde belirli ifadelerin geçtiği satırları bulabiliriz. Birçok değerin ilgili dosyalarda tutulduğu Linux dünyasında, işimizi ciddi anlamda kolaylaştıran bir araçtır.

Bu yazıda, günlük hayatta işimize yarayabilecek bazı grep opsiyonlarını göreceğiz.

Örnek 1: SSH Server’ın Port Numarası

SSH server’ımız hizmet verdiği port numarasını görebilmek için, dosya içerisinde “port” kelimesini grep’leyeceğiz. Bunu yaparken arada birkaç opsiyona da değinmiş olacağız.

Kullanım: grep [opsiyonlar] ifade [dosya(lar)]

[root@gnuadmin ~]# grep port /etc/ssh/sshd_config 
# If you want to change the port on a SELinux system, you have to tell
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
# WARNING: 'UsePAM no' is not supported in Red Hat Enterprise Linux and may cause several

Yukarıdaki örnekte, “/etc/ssh/sshd_config” dosyasında “port” ifadesini aradık. Eşleşen satırlar karşımıza geldi. Ancak bunların hepsi “#” karakteriyle başlıyor ve baya baya özneli yüklemli cümleler. Aradığımız bu değil.

İpucu 1: grep komutu, büyük-küçük harfe duyarlıdır (case sensitive). “port” ifadesini ararsanız, “Port”, “PORT” gibi varyasyonlar göz ardı edilir. Bu duyarlılığı kaldırmak için “-i” opsiyonu kullanılabilir.

Şimdi de “Port” ifadesini arayalım:

[root@gnuadmin ~]# grep Port /etc/ssh/sshd_config 
#Port 22
#GatewayPorts no

Bir şeyler bulduk gibi. Şimdi de büyük-küçük harf duyarlılığı olmadan bir arama yapalım:

[root@gnuadmin ~]# grep -i port /etc/ssh/sshd_config 
# If you want to change the port on a SELinux system, you have to tell
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#Port 22
# WARNING: 'UsePAM no' is not supported in Red Hat Enterprise Linux and may cause several
#GatewayPorts no

İki sonucun birleşmiş hâlini görüyoruz. Bulduğumuz “#Port 22” satırı işimizi görecek gibi. Ancak dosyanın tam olarak neresinde?

İpucu 2: grep’in bulduğu satırın, dosyadaki kaçıncı satır olduğunu öğrenmek için “-n” opsiyonu kullanılabilir.

[root@gnuadmin ~]# grep -in port /etc/ssh/sshd_config 
13:# If you want to change the port on a SELinux system, you have to tell
15:# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
17:#Port 22
94:# WARNING: 'UsePAM no' is not supported in Red Hat Enterprise Linux and may cause several
100:#GatewayPorts no

Yukarıdaki çıktıdan anlaşılacağı üzere, SSH servisimizin dinleyeceği portu belirleyen ayar; “/etc/ssh/sshd_config” dosyasındaki 17. satır olan “#Port 22” ifadesi.

Örnek 2: Birden Fazla Dosyada Arama

Linux’ta loglarımızın bulunduğu dizinlerden biri “/var/log” dizini. Bu dizinde ise birçok dosya bulunuyor. grep kullanımında dosya isimlerini belirtirken “wildcard” kullanabilirsiniz. Aşağıdaki örnek grep komutunda, “/var/log” dizini altındaki dosyalarda “error” ifadesini arıyoruz:

[root@gnuadmin ~]# grep -i error /var/log/*
grep: /var/log/anaconda: Bir dizin
grep: /var/log/audit: Bir dizin
/var/log/dmesg:[    0.598803] BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter.
/var/log/dmesg:[    1.526336] [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message.
/var/log/dmesg:[    1.526953] [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message.
/var/log/dmesg.old:[    1.032259] BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter.
/var/log/dmesg.old:[    2.772066] [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message.
/var/log/dmesg.old:[    2.773353] [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message.
/var/log/grubby_prune_debug:[1630650982] Error       : Could not find a bootloader configuration to back up
İkilik dosya /var/log/messages eşleşir
grep: /var/log/rhsm: Bir dizin
grep: /var/log/tuned: Bir dizin

grep komutu, dosyalarda arama yaptığı için, “/var/log” altındaki dizinleri göz ardı etti. Çünkü “/var/log/*” ifadesi, bu dizin altındaki dosya ve dizinlerin tamamını grep’e parametre olarak gönderdi.

İpucu 3: grep kullanırken aramayı alt dizinlere de genişletmek için “-r” opsiyonu kullanılabilir.

[root@gnuadmin ~]# grep -ir error /var/log/*
/var/log/anaconda/X.log:	(WW) warning, (EE) error, (NI) not implemented, (??) unknown.
/var/log/anaconda/syslog:06:31:22,587 INFO kernel:BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter.
/var/log/anaconda/syslog:06:31:25,868 INFO dracut-pre-udev:modprobe: ERROR: could not insert 'floppy': No such device
/var/log/anaconda/syslog:06:31:27,675 ERR kernel:[drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message.
/var/log/anaconda/syslog:06:31:27,703 ERR kernel:[drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message.
/var/log/anaconda/syslog:06:31:33,306 ERR systemd-udevd:ctx=0x558fcbfe63d0 path=/lib/modules/3.10.0-1160.el7.x86_64/kernel/sound/pci/ac97/snd-ac97-codec.ko.xz error=No such file or directory
/var/log/anaconda/syslog:06:31:37,579 ERR multipathd:uevent trigger error
/var/log/anaconda/syslog:06:31:38,403 DEBUG NetworkManager:<debug> [1630650698.4014] keyfile: cannot read directory '/var/run/NetworkManager/system-connections': Error opening directory “/var/run/NetworkManager/system-connections”: No such file or directory
[....................................]

Gördüğünüz gibi, bir önceki örnekte dizin olduğu için göz ardı edilen “/var/log/anaconda” içindeki bazı dosyalarda da “error” ifadesi geçiyormuş.

Örnek 3: Kelimeyi Olduğu Gibi Aramak

grep komutu, varsayılan olarak, ifadenin geçtiği her satırı bulur. “/var/log/dmesg” dosyasında “boot” ifadesini arayalım:

[root@gnuadmin ~]# grep -i boot /var/log/dmesg
[    0.000000] Command line: BOOT_IMAGE=/vmlinuz-3.10.0-1160.42.2.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=en_US.UTF-8
[    0.000000] smpboot: Allowing 1 CPUs, 0 hotplug CPUs
[    0.000000] Booting paravirtualized kernel on KVM
[    0.000000] Kernel command line: BOOT_IMAGE=/vmlinuz-3.10.0-1160.42.2.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=en_US.UTF-8
[    0.137422] smpboot: CPU0: Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz (fam: 06, model: 5e, stepping: 03)
[    0.232628] smpboot: Max logical packages: 1
[    0.232630] smpboot: Total of 1 processors activated (5183.99 BogoMIPS)
[    0.272717] pci 0000:00:02.0: Boot video device
[    0.598803] BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter.

Eşleşen satırlara dikkat ederseniz, “smpboot” ve “booting” gibi kelimeleri de göreceksiniz. Evet, smpboot içinde “boot” kelimesi geçiyor. Ancak bizim istediğimiz “boot” kelimesini içeren satırları getirmek. Bu ifadenin bulunduğu satırlar yerine, sadece ve sadece, olduğu gibi bu kelimenin bulunduğu satırları görmek istiyoruz.

İpucu 4: grep kullanırken, kelimeyi bütünüyle eşleştirmek için “-w” opsiyonu kullanılabilir.

[root@gnuadmin ~]# grep -iw boot /var/log/dmesg
[    0.272717] pci 0000:00:02.0: Boot video device
[    0.598803] BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter.

Örnek 4: İfadenin Kaç Satırda Geçtiğini Bulmak

yum” programının loglarını inceleyip kaç kez paket kurma işlemi yapıldığını bulmak istediğimizi varsayalım. “/var/log/yum.log” dosyasında geçen “Installed” ifadeleri bize bu konuda yardımcı olabilir.

[root@gnuadmin ~]# grep Installed /var/log/yum.log 
Sep 03 10:06:10 Installed: kernel-3.10.0-1160.41.1.el7.x86_64
Oct 06 22:07:23 Installed: kernel-3.10.0-1160.42.2.el7.x86_64
Oct 06 22:57:30 Installed: wget-1.14-18.el7_6.1.x86_64
Oct 06 23:54:54 Installed: crontabs-1.11-6.20121102git.el7.noarch
Oct 27 22:56:10 Installed: strace-4.24-6.el7.x86_64
Dec 23 00:55:20 Installed: net-tools-2.0-0.25.20131004git.el7.x86_64

Neyse ki çıktımızda satır sayısı az. Ancak durum her zaman böyle olmayabilir.

İpucu 5: grep komutuna “-c” opsiyonunu ekleyerek, aradığınız ifadenin kaç satırda geçtiğini bulabilirsiniz.

[root@gnuadmin ~]# grep -c Installed /var/log/yum.log 
6

Örnek 5: Birden Fazla Kelimeyi Aramak

İpucu 6: grep kullanırken, birden fazla kelimeyi içeren ifadeleri aramak için, ifadeyi çift tırnak işaretleri arasına alabilirsiniz.

Aşağıdaki örnekte, “/var/log/dmesg” dosyası içinde “Hypervisor detected” geçen satırları arıyoruz:

[root@gnuadmin ~]# grep "Hypervisor detected" /var/log/dmesg
[    0.000000] Hypervisor detected: KVM

Örnek 6: Eşleşen Satırın Öncesi ve Sonrasındaki Satırlar

Bazen, aradığınız ifadenin eşleştiği satırlardan önceki ve/veya sonraki satırları da görmek isteyebilirsiniz.

İpucu 7: grep kullanırken; eşleşen satırdan sonraki n satırı da getirmek için “-An” opsiyonunu kullanabilirsiniz. Önceki satırlar için “-Bn“, hem önceki hem sonraki satırlar için ise “-Cn” kullanabilirsiniz.

Aşağıdaki örnekte, yine “/var/log/dmesg” dosyası içerisinde “Hypervisor detected” ifadesini arıyoruz. Ancak önce bu ifadeyi arıyoruz. Sonra bu ifadenin geçtiği satırdan önceki 3 satırı, daha sonra bu ifadenin geçtiği satırdan sonraki 3 satırı ve son olarak da bu ifadenin geçtiği satırdan önceki ve sonraki 3’er satırı da getiriyoruz.

[root@gnuadmin ~]# grep "Hypervisor detected" /var/log/dmesg
[    0.000000] Hypervisor detected: KVM
[root@gnuadmin ~]# grep -B3 "Hypervisor detected" /var/log/dmesg
[    0.000000] NX (Execute Disable) protection: active
[    0.000000] SMBIOS 2.5 present.
[    0.000000] DMI: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
[    0.000000] Hypervisor detected: KVM
[root@gnuadmin ~]# grep -A3 "Hypervisor detected" /var/log/dmesg
[    0.000000] Hypervisor detected: KVM
[    0.000000] e820: update [mem 0x00000000-0x00000fff] usable ==> reserved
[    0.000000] e820: remove [mem 0x000a0000-0x000fffff] usable
[    0.000000] e820: last_pfn = 0x3fff0 max_arch_pfn = 0x400000000
[root@gnuadmin ~]# grep -C3 "Hypervisor detected" /var/log/dmesg
[    0.000000] NX (Execute Disable) protection: active
[    0.000000] SMBIOS 2.5 present.
[    0.000000] DMI: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
[    0.000000] Hypervisor detected: KVM
[    0.000000] e820: update [mem 0x00000000-0x00000fff] usable ==> reserved
[    0.000000] e820: remove [mem 0x000a0000-0x000fffff] usable
[    0.000000] e820: last_pfn = 0x3fff0 max_arch_pfn = 0x400000000
grep komutu örneği
grep komutu örneği

Örnek 7: Satırın Başlangıcına Ya Da Bitişine Göre Arama Yapmak

Belirli bir ifadeyle başlayan ya da biten satırları bulabilmek için regular expressions’tan faydalanabiliriz. Aşağıdaki örnekte, “/etc/fstab” dosyasında “/dev” ile başlayan satırları getiriyoruz:

[root@gnuadmin ~]# grep ^/dev /etc/fstab 
/dev/mapper/centos-root /                       ext4    defaults        1 1
/dev/mapper/centos-swap swap                    swap    defaults        0 0

Benzer şekilde, belirli bir ifadeyle biten satırları getirme şansımız da var. Örneğin, “/etc/fstab” dosyasındaki girdilerde, son sütunu “sıfır” olan satırlar, fsck programı tarafından boot sırasında kontrol edilmesi istenmeyen alanları gösterir.

Önemli: fsck programının bu davranışı sergilemesini sağlayan tek seçenek bu değildir. Dolayısıyla bu komut ile alacağınız çıktı, fsck’in kontrol etmemesini istediğiniz tüm alanları listelemeyebilir.

[root@gnuadmin ~]# grep 0$ /etc/fstab 
/dev/mapper/centos-swap swap                    swap    defaults        0 0

Örnek 8: Birden Fazla ifadeyi Aynı Anda Aramak

Bazen dosya içerisinde farklı kelimelerin geçtiği tüm satırları görmek isteyebilirsiniz.

Örneğin, “/etc/passwd” dosyasında tanımlı shell’ler ile ilgili bir arama yapalım. Kullanıcılarımız arasından, shell’inde “bash“, “halt” ve “shutdown” tanımlı olanları listelemek istediğimizi varsayalım.

İpucu 8: grep komutunu kullanırken birden fazla ifade ile arama yapmak için “-e” opsiyonu kullanılabilir.

[root@gnuadmin ~]# grep  -e bash -e halt -e shutdown /etc/passwd
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.