Android

Perintah Grep dalam linux (cari teks dalam fail)

9.Linux для Начинающих - Комманда grep и Регулярные Выражения

9.Linux для Начинающих - Комманда grep и Регулярные Выражения

Isi kandungan:

Anonim

Perintah grep yang bermaksud "cetak ungkapan biasa global" adalah salah satu perintah yang paling berkuasa dan lazim digunakan di Linux.

Grep mencari satu atau lebih fail input untuk baris yang sepadan dengan corak yang diberikan dan menulis setiap baris yang hampir sama dengan output standard. Jika tiada fail ditentukan, grep dibaca dari input standard, yang biasanya merupakan output dari perintah lain.

Dalam tutorial ini, kami akan menunjukkan kepada anda cara menggunakan perintah grep melalui contoh-contoh praktikal, dan penjelasan terperinci mengenai pilihan grep GNU yang paling biasa.

Syntax Command Grep

Sebelum masuk ke cara menggunakan arahan grep , mari kita mulakan dengan mengkaji sintaks dasar.

Ungkapan utiliti grep mengambil bentuk berikut:

grep PATTERN

Barang dalam kurungan persegi adalah pilihan.

  • OPTIONS - Nol atau lebih banyak pilihan. Grep menyediakan beberapa pilihan yang mengawal kelakuannya. PATTERN - Corak carian. FILE - Sifar atau lebih banyak nama fail input.

Untuk dapat mencari fail itu, pengguna yang menjalankan arahan mesti membaca akses ke fail tersebut.

Bagaimana cara menggunakan grep untuk Mencari String dalam Fail

Penggunaan yang paling asas bagi arahan grep adalah untuk mencari rentetan (teks) dalam fail.

Sebagai contoh, untuk memaparkan baris dari fail /etc/passwd mengandungi rentetan bash anda boleh menggunakan arahan berikut:

grep bash /etc/passwd

Keluaran seharusnya kelihatan seperti ini:

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

Sekiranya rentetan itu mengandungi ruang, anda perlu menyertakannya dalam tanda petikan tunggal atau berganda:

grep "Gnome Display Manager" /etc/passwd

Invert Match (Tidak Termasuk)

Untuk memaparkan garis yang tidak sepadan dengan corak, gunakan opsyen -v (atau --invert-match ).

Sebagai contoh untuk memaparkan baris dari fail /etc/passwd yang tidak mengandungi string nologin anda boleh menggunakan perintah berikut:

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

Bagaimana untuk menggunakan Grep untuk Cari String dalam Output Perintah

Daripada menentukan fail input, anda boleh paip output arahan lain untuk grep , dan kemudian memaparkan hanya baris sepadan dengan corak yang diberikan.

Contohnya, untuk mengetahui proses mana yang dijalankan pada sistem anda sebagai pengguna www-data anda boleh menggunakan perintah ps berikut:

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

Anda juga boleh mengitar pelbagai paip dalam arahan. Seperti yang anda lihat dalam output di atas terdapat juga garis yang mengandungi proses grep . Jika anda tidak mahu garis yang ditunjukkan akan lulus output kepada contoh grep lain seperti ditunjukkan di bawah.

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

Carian Rekursif

Cari secara rawak menggunakan pola menggunakan, gunakan pilihan -r (atau - --recursive ). Ini akan mencari semua fail dalam direktori yang ditentukan, melangkau symlinks yang ditemui secara rekursif. Untuk mengikuti semua pautan simbolik, gunakan pilihan -R (atau --dereference-recursive ).

Dalam contoh berikut, kami mencari rentetan linuxize.com dalam semua fail di dalam direktori /etc :

grep -r linuxize.com /etc

Perintah ini akan mencetak garis-garis yang hampir sama dengan jalan penuh ke fail.

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

Jika sebaliknya -r anda menggunakan -R pilihan grep akan mengikuti semua pautan simbolik:

grep -R linuxize.com /etc

Perhatikan baris terakhir output. Garis itu tidak dicetak dalam contoh di atas kerana fail dalam direktori yang sites-enabled oleh Nginx adalah symlinks kepada fail konfigurasi di dalam direktori yang sites-available di sites-available web.

/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;

Tunjukkan Hanya Nama Fail

Untuk menekan output grep lalai dan cetak hanya nama fail yang mengandungi corak yang sepadan, anda boleh menggunakan opsyen -l (atau - --files-with-matches ).

Sebagai contoh untuk mencari semua fail yang berakhir dengan .conf dalam direktori kerja semasa dan cetak hanya nama fail yang mengandungi jenis string linuxize.com :

grep -l linuxize.com *.conf

Output akan kelihatan seperti ini:

tmux.conf haproxy.conf

Pilihan -l biasanya digunakan dalam kombinasi dengan pilihan rekursif -R :

grep -Rl linuxize.com /tmp

Carian Insensitif Kes

Secara lalai, perintah grep adalah sensitif huruf. Ini bermakna bahawa aksara huruf besar dan huruf kecil dianggap berbeza.

Untuk mengabaikan kes apabila mencari, gunakan pilihan -i (atau --ignore-case ).

Sebagai contoh, apabila mencari Zebra tanpa sebarang pilihan, arahan berikut tidak akan menunjukkan sebarang output iaitu terdapat padanan baris:

grep Zebra /usr/share/words

Tetapi jika anda melakukan carian yang tidak sensitif dengan menggunakan pilihan -i , ia akan sepadan dengan kedua-dua huruf besar dan huruf kecil:

grep -i Zebra /usr/share/words

Menentukan "Zebra" akan sepadan dengan "zebra", "ZEbrA" atau sebarang kombinasi huruf besar dan huruf kecil untuk rentetan itu.

zebra zebra's zebras

Cari Perkataan Penuh

Apabila mencari "gnu", grep juga akan mencetak garis di mana "gnu" tertanam dalam kata yang lebih besar, seperti "cygnus" atau "magnum".

grep gnu /usr/share/words

cygnus gnu interregnum lgnu9d lignum magnum magnuson sphagnum wingnut

Untuk kembali hanya baris-baris di mana rentetan yang ditentukan adalah keseluruhan perkataan (tertutup oleh aksara bukan kata), gunakan pilihan -w (atau - --word-regexp ).

Watak kata termasuk aksara abjad angka ( az , AZ dan 0-9 ) dan garis bawah ( _ ). Semua aksara lain dianggap sebagai aksara bukan perkataan.

grep -w gnu /usr/share/words

gnu

Tunjukkan Nombor Talian

Untuk menunjukkan bilangan garisan yang mengandungi rentetan yang sepadan dengan corak, gunakan pilihan -n (atau - --line-number ). Apabila menggunakan pilihan ini, grep akan mencetak padanan untuk keluaran standard yang diawali dengan nombor baris yang ditemui pada.

Sebagai contoh untuk memaparkan baris dari fail /etc/services mengandungi rentetan bash diawali dengan nombor baris yang sesuai, anda boleh menggunakan perintah berikut:

grep -n 10000 /etc/services

Keluaran di bawah menunjukkan kepada kami bahawa perlawanan ditemui pada garisan 10423 dan 10424.

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

Count Matches

Untuk mencetak kiraan baris sepadan dengan output standard, gunakan pilihan -c (atau --count ).

Dalam contoh di bawah, kami mengira bilangan akaun yang mempunyai /usr/bin/zsh sebagai shell.

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

4

Cari Struktur Pelbagai (Corak)

Dua atau lebih corak carian boleh disambungkan menggunakan operator ATAU | .

Secara lalai, grep menafsirkan corak sebagai ungkapan biasa asas di mana aksara meta seperti | kehilangan makna khas mereka, dan versi backslashed mereka mesti digunakan.

Dalam contoh di bawah ini kita sedang mencari semua kejadian perkataan yang fatal , error , dan critical dalam fail ralat log Nginx:

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

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

Mod Tenang

The -q (atau --quiet ) memberitahu grep untuk tidak menulis apa-apa ke terminal (output standard). Jika perlawanan ditemui, arahan akan keluar dengan status 0 . Ini berguna apabila menggunakan skrip shell grep di mana anda ingin menyemak sama ada fail mengandungi rentetan dan melakukan tindakan tertentu bergantung kepada hasilnya.

Berikut adalah contoh menggunakan grep dalam mod senyap sebagai arahan ujian dalam pernyataan if :

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

Ekspresi Biasa Biasa

GNU Grep mempunyai dua set ciri biasa, Basic dan Extended. Secara lalai, grep menafsirkan corak sebagai ungkapan biasa asas.

Apabila digunakan dalam mod ungkapan biasa asas, semua aksara lain kecuali aksara meta, sebenarnya merupakan ungkapan biasa yang sesuai dengan dirinya sendiri. Di bawah ini adalah senarai aksara meta yang paling biasa digunakan:

  • Gunakan simbol ^ (karet) untuk memadankan ekspresi pada permulaan garisan. Dalam contoh berikut, rentetan ^kangaroo akan dipadankan hanya jika ia berlaku pada awal permulaan garis.

    grep "^kangaroo" file.txt

    Gunakan simbol $ (dollar) untuk mencocokkan ungkapan pada akhir baris. Dalam contoh berikut, rentetan kangaroo$ akan dipadankan hanya jika ia berlaku pada hampir satu baris.

    grep "kangaroo$" file.txt

    Gunakan . simbol (tempoh) untuk memadankan mana-mana aksara tunggal. Sebagai contoh, untuk memadankan apa-apa yang bermula dengan kan maka mempunyai dua aksara dan berakhir dengan tali roo , anda boleh menggunakan pola berikut:

    grep "kan..roo" file.txt

    Guna (kurungan) untuk memadankan mana-mana watak tunggal yang tertutup dalam kurungan. Sebagai contoh, cari garisan yang mengandungi accept atau " accent , anda boleh menggunakan corak berikut:

    grep "accet" file.txt

    Guna (kurungan) untuk memadankan mana-mana watak tunggal yang tertutup dalam kurungan. Corak berikut akan sepadan dengan mana-mana kombinasi rentetan yang mengandungi co(any_letter_except_l)a , seperti coca , cobalt dan sebagainya, tetapi tidak sepadan dengan baris yang mengandungi cola , grep "coa" file.txt

Untuk melarikan diri dari makna khas watak seterusnya, gunakan simbol \ (backslash).

Ekspresi Biasa Dipanjangkan

Untuk mentafsir corak sebagai ungkapan tetap lanjutan, gunakan pilihan -E (atau - --extended-regexp ). Ekspresi biasa diperluas merangkumi semua aksara meta asas, bersama-sama dengan aksara meta tambahan untuk mencipta corak carian yang lebih rumit dan kuat. Berikut adalah beberapa contoh:

  • Padankan dan ekstrak semua alamat e-mel daripada fail yang diberikan:

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

    Padankan dan ekstrak semua alamat IP yang sah dari fail yang diberikan:

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

Pilihan -o digunakan untuk mencetak hanya rentetan padanan.

Cetak Talian Sebelum Perlawanan

Untuk mencetak bilangan baris tertentu sebelum memadankan baris, gunakan pilihan -B (atau - --before-context ).

Sebagai contoh, untuk memaparkan lima baris konteks utama sebelum baris yang hampir sama, anda akan menggunakan arahan berikut:

grep -B 5 root /etc/passwd

Cetak Talian Selepas Perlawanan

Untuk mencetak nombor tertentu garisan selepas baris padanan, gunakan pilihan -A (atau --after-context ).

Sebagai contoh untuk memaparkan lima baris konteks trailing selepas baris yang sepadan, anda akan menggunakan arahan berikut:

grep -A 5 root /etc/passwd

Kesimpulannya

Perintah grep membolehkan anda mencari pola di dalam fail. Jika perlawanan jika dijumpai, grep akan mencetak garisan yang mengandungi pola yang ditentukan.

Terdapat banyak lagi untuk mengetahui tentang Grep di halaman Manual Pengguna Grep.

terminal grep