Penggunaan betul Cari dan arahan Grep di Linux

Kebanyakan pengguna baru sistem Unix, khususnya Linux, tidak biasa dengan pengendali baris arahan asas yang digunakan dalam OS ini. Mari kita lihat dengan lebih dekat fungsi dan penggunaan operator cari dan grep.

Menggunakan Cari dan arahan Grep di Linux.

MENCARI

Perintah mencari Linux adalah utiliti baris perintah untuk melintasi hierarki fail. Ia boleh digunakan untuk mencari fail dan direktori dan melakukan operasi seterusnya dengan mereka. Ia menyokong carian dengan fail, folder, nama, tarikh penciptaan, tarikh perubahan, pemilik dan kebenaran. Menggunakan -exec, arahan UNIX lain boleh dijalankan untuk fail atau folder yang dijumpai. Sintaks:

$ cari [tempat untuk memulakan carian] [ungkapan menentukan apa yang hendak dicari] [-options] [apa yang hendak dicari]

Pilihan:

  • -exec - fail yang diperlukan yang memenuhi kriteria di atas dan mengembalikan 0 sebagai keadaan keluar untuk pelaksanaan perintah yang berjaya;
  • -ok - berfungsi sama seperti -exec, kecuali pengguna mula-mula diminta;
  • -inum N - cari dengan nombor "N";
  • -nlink N - cari dengan pautan "N";
  • demo nama-nama - cari fail yang dinyatakan dalam "demo";
  • fail baru - cari fail yang telah diubah suai / dibuat selepas "fail";
  • -perm oktal - cari jika resolusi adalah oktaf;
  • -print - tunjukkan laluan kepada dokumen-dokumen yang didapati menggunakan kriteria lain;
  • -empty - cari dokumen kosong dan direktori;
  • -size + N / -N - blok carian "N"; "N" dan "c" boleh digunakan untuk mengukur saiz dalam aksara; "+ N" bermaksud saiz lebih besar daripada blok "N", dan "-N" bermaksud saiz kecil "N" blok;
  • -mereka nama - cari dokumen kepunyaan nama pengguna atau pengenal "nama";
  • \ (expr \) - Benar jika "expr" adalah benar; Digunakan untuk kriteria kumpulan bersempena dengan ATAU atau AND.

Grep

Perintah grep digunakan untuk mencari fail. Fungsi ini bermaksud "percetakan global ungkapan biasa" dan merupakan salah satu perintah yang paling kuat dan kerap digunakan di Linux. Perintah mencari satu atau beberapa fail input yang sepadan dengan pola yang ditentukan, dan menulis setiap baris yang bersamaan dengan output standard. Sekiranya tiada fail ditentukan, arahannya dibaca dari input standard, yang biasanya merupakan output dari arahan lain. Dalam artikel ini, kami akan menunjukkan kepada anda bagaimana untuk memasukkan arahan, dengan contoh praktikal dan penjelasan terperinci tentang pilihan GNU yang paling umum.

Sintaks arahan

Sebelum kita mula menggunakan arahan itu, mari kita mulakan dengan mengkaji sintaks dasar. Ungkapan utiliti mempunyai bentuk berikut:

[PILIHAN] PATTERN [FILE ...]

Item dalam kurungan persegi adalah pilihan.

  • OPSYEN - sifar atau lebih banyak pilihan. Pasukan ini menyediakan beberapa pilihan yang mengawal kelakuannya.
  • POLISI - Corak carian.
  • FILE - sifar atau lebih banyak nama fail input.

Bagaimana untuk memasukkan arahan untuk mencari fail

Tujuan utamanya ialah mencari teks dalam fail. Sebagai contoh, untuk memaparkan dari fail / etc / passwd yang mengandungi baris bash, anda boleh menggunakan arahan berikut:

$ grep bash / etc / passwd

Keluaran seharusnya kelihatan seperti ini:

root 0: 0: root: / root: / bin / bash

domain1000: 1000: domain: / home / domain: / bin / bash

Sekiranya tali mengandungi ruang, anda perlu memasukkannya dalam petikan tunggal atau berganda:

$ "Pengurus Paparan Gnome" / etc / passwd

Invert Match (ex)

Untuk memaparkan baris yang tidak sepadan dengan corak, masukkan parameter -v (atau peralihan-padanan). Sebagai contoh, untuk memaparkan fail yang tidak mengandungi nologin dari fail / etc / passwd, anda boleh memasukkan arahan berikut:

$ -v nologin / etc / passwd

Output:

root 0: 0: root: / root: / bin / bash

colord 124: 124 :: / var / lib / colord: / bin / false

git 994: 994: git daemon user: /: / usr / bin / git-shell

linuxize 1000: 1000: linuxize: / home / linuxize: / bin / bash

Bagaimana untuk menggunakan arahan untuk mencari dalam output

Sebaliknya, jika anda menentukan fail input, anda boleh mengalihkan output arahan lain, dan kemudian memaparkan hanya baris yang sepadan dengan pola yang ditentukan. Sebagai contoh, untuk mengetahui proses mana yang dijalankan pada sistem anda sebagai pengguna data www, anda boleh menggunakan arahan berikut:

$ ps -ef | www-data

Output:

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 -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: proses pekerja

www-data 31148 12770 0 Oct22? 00:00:00 nginx: proses pengurus cache

Anda juga boleh menggabungkan beberapa saluran ke dalam satu pasukan. Seperti yang anda lihat dalam output di atas, terdapat juga garis yang mengandungi proses tersebut. Sekiranya anda tidak mahu baris ini dipaparkan, hantarkan output kepada contoh lain seperti yang ditunjukkan di bawah.

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

Output:

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 -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: proses pekerja

www-data 31148 12770 0 Oct22? 00:00:00 nginx: proses pengurus cache

Carian rekursif

Untuk mencari pola secara rekursif, masukkan pilihan -r (atau-rekursif). Ini akan membolehkan anda mencari semua fail dalam direktori yang dinyatakan, melangkau pautan simbolik yang berlaku secara rekursif. Untuk meneruskan semua pautan simbolik, gunakan pilihan -r (atau -dereference-recursive). Dalam contoh berikut, kami mencari domain.com dalam semua fail di dalam direktori / etc:

$ -r domain.com / etc

Perintah akan mencetak medan yang sesuai dengan awalan jalan fail penuh.

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

Jika bukan -r anda menggunakan pilihan -R, arahan akan mengikuti semua pautan simbolik:

$ -R domain.com / etc

Perhatikan bidang output terakhir. Ini tidak dicetak dalam contoh di atas, kerana fail-fail dalam direktori Nginx yang didayakan oleh laman web adalah pautan simbolik ke fail konfigurasi di dalam direktori tapak yang tersedia.

Output:

/etc/hosts:127.0.0.1 node2.domain.com

/etc/nginx/sites-available/domain.com: server_name domain.com www.domain.com;

/etc/nginx/sites-enabled/domain.com: server_name domain.com www.domain.com;

Tunjukkan hanya nama fail

Untuk menekan output lalai dan cetak hanya nama fail yang mengandungi corak yang sepadan, anda boleh memasukkan opsyen -l (atau -files-dengan-padanan). Sebagai contoh, untuk mencari semua fail yang berakhir di .conf dalam direktori kerja semasa, dan hanya mencetak nama fail yang mengandungi jenis domain.com, ketik:

$ -L domain.com * .conf

Output akan kelihatan seperti ini:

tmux.conf

haproxy.conf

Pilihan -l biasanya digunakan bersama-sama dengan pilihan -R recursive:

$ -Rl domain.com / tmp

Kesensitiviti kes

Secara lalai, arahannya adalah sensitif huruf, yang bermaksud huruf besar dan huruf kecil dianggap berbeza. Untuk mengabaikan kes apabila mencari, masukkan pilihan -i (atau -dasar-kes). Sebagai contoh, jika anda mencari Zebra tanpa sebarang pilihan, arahan berikut tidak akan memaparkan sebarang output, iaitu. terdapat padanan.

$ Zebra / usr / share / words

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

$ grep -i Zebra / usr / share / words

Petunjuk "Zebra" akan sesuai dengan "Zebra", "ZEbrA" atau gabungan huruf besar dan huruf kecil lainnya.

Output:

zebra

zebra

zebra

Perlawanan tepat

Apabila mencari, gnu juga akan mencetak gnu, di mana kata-kata yang lebih besar dimasukkan, seperti cygnus atau magnum.

$ gnu / usr / share / words

Output:

cygnus

gnu

interregnum

lgnu9d

lignum

magnum

magnuson

sphagnum

sayap

Untuk mengembalikan hanya ungkapan-ungkapan di mana medan tertentu adalah keseluruhan perkataan (tidak disertakan dalam kata-kata), anda boleh menggunakan pilihan -w (atau -word-regexp).

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

Sekiranya anda menjalankan arahan yang sama seperti di atas, termasuk pilihan -w, arahan akan kembali hanya yang mengandungi gnu sebagai kata yang berasingan.

$ grep -w gnu / usr / share / words

Keluaran: gnu

Tunjukkan nombor

Untuk menunjukkan bilangan garisan yang mengandungi corak, gunakan parameter -n (atau garis-nombor). Menggunakan pilihan ini akan mencetak padanan kepada output standard dengan awalan nombor di mana ia dijumpai. Sebagai contoh, untuk memaparkan dari fail / etc / services yang mengandungi awalan bash dengan nombor yang sepadan, anda boleh menggunakan arahan berikut:

$ grep -n 10000 / etc / services

Keluaran di bawah menunjukkan bahawa perlawanan berada di 10423 dan 10424.

Output:

10423: ndmp 10, 000 / tcp

10424: ndmp 10000 / udp

Mengira

Untuk mencetak bilangan baris sepadan dengan output standard, gunakan parameter -c (atau -count). Dalam contoh di bawah, kami mengira bilangan akaun yang mempunyai shell / usr / bin / zsh.

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

Output: 4

Beberapa baris (corak)

Operator ATA boleh menggabungkan dua atau lebih corak carian |. Secara lalai, arahan menafsirkan corak sebagai ungkapan biasa utama, di mana metak barter kehilangan makna tertentu, dan versi mereka dengan backslash harus digunakan. Dalam contoh di bawah, kami mencari semua kejadian perkataan yang membawa maut, ralat, dan kritikal dalam fail log kesilapan Nginx:

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

Sekiranya anda menggunakan pilihan ekspresi biasa yang diperluas -E (atau -extended-regexp), pernyataan itu tidak boleh dilepaskan seperti yang ditunjukkan di bawah:

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

Ungkapan biasa

GNU Grep mempunyai dua set fungsi ungkapan biasa - Basic dan Extended. Secara lalai, fungsi menafsirkan corak sebagai ungkapan biasa asas, untuk bertukar kepada ungkapan biasa yang panjang, anda perlu menggunakan pilihan -E. Apabila menggunakan ungkapan biasa dalam mod utama, semua aksara lain, kecuali metacharacters, sebenarnya adalah ungkapan biasa yang sepadan dengan satu sama lain. Di bawah ini adalah senarai metakarakter yang paling biasa digunakan:

  • Gunakan aksara ^ (watak karet) untuk menyesuaikan ungkapan pada awal baris. Dalam contoh berikut, ^ kanggaru akan dipadankan hanya jika ia berlaku pada mulanya: $ grep "^ kangaroo" file.txt
  • Gunakan simbol $ (dolar) untuk menyesuaikan ungkapan di akhir. Dalam contoh berikut, anguru $ hanya akan dipadankan jika ia ditemui pada akhirnya: grep "kangaroo $" file.txt
  • Gunakan simbol. (titik) untuk memadankan mana-mana watak tunggal. Sebagai contoh, untuk memadankan semua yang bermula dengan dua aksara dan berakhir dengan roo, anda boleh menggunakan corak berikut: $ grep "kan..roo" file.txt
  • Gunakan [] (kurung) untuk menyesuaikan mana-mana aksara tunggal yang tertutup dalam kurungan. Sebagai contoh, cari yang mengandungi penerimaan atau "aksen, anda boleh menggunakan corak berikut: $ grep" acce [np] t "file.txt

Untuk mengelakkan makna khas watak seterusnya, gunakan aksara \ (backslash).

Lanjutan ungkapan biasa

Untuk mentafsirkan corak sebagai ekspresi biasa yang panjang, gunakan parameter -E (atau ketinggian-regexp). Ekspresi biasa diperluas termasuk semua metakarakter asas, serta metakarakter tambahan untuk membuat pola carian yang lebih rumit dan kuat. Berikut adalah beberapa contoh:

  • Padan dan ekstrak semua alamat e-mel dari fail ini: $ grep -E -o "\ b [A-Za-z0-9 ._% + -] [A-Za-z0-9 .-] \. [A-Za-z] {2.6} \ b "file.txt
  • Map dan ekstrak semua alamat IP yang sah dari fail ini: $ grep -E -o '(25 [0-5] | 2 [0-4] [0-9] | [01]? [0-9] [0 -9]?) \. (25 [0-5] | 2 [0-4] [0-9] | [01]? [0-9] [0-9]?) [0-4] [0-9] | [01]? [0-9] [0-9]?) \. (25 [0-5] | 2 [0-4] 9] | [01]? [0-9] [0-9]?) 'File.txt

Pilihan -o digunakan untuk mencetak hanya padanan.

Cetak sebelum mengira

Untuk mencetak sejumlah baris sebelum dipadankan, gunakan parameter -B (atau sebelum-konteks). Sebagai contoh, untuk memaparkan 5 baris konteks awal sebelum padanan, anda boleh menggunakan arahan berikut: $ grep -A 5 root / etc / passwd

Cetak selepas carian

Untuk mencetak nombor tertentu garisan selepas perlawanan, gunakan parameter -A (atau selepas konteks). Sebagai contoh, untuk memaparkan 5 baris konteks akhir selepas rentetan rentetan, anda boleh menggunakan arahan berikut: $ grep -B 5 root / etc / passwd

Ini semua perlu untuk kegunaan sepenuhnya maklumat arahan. Sekiranya anda sudah menggunakan Linux dan boleh memberi nasihat kepada pemula, kongsi komen di bawah artikel ini.