Rumah  >  Artikel  >  Tutorial sistem  >  Pemahaman mendalam tentang arahan grep: penggunaan ungkapan biasa dalam grep

Pemahaman mendalam tentang arahan grep: penggunaan ungkapan biasa dalam grep

PHPz
PHPzke hadapan
2024-01-13 13:30:21730semak imbas
Pengenalan Bagaimana cara saya menggunakan ungkapan biasa arahan Grep dalam sistem seperti Linux dan Unix? Linux disertakan dengan alat arahan GNU grep, yang menyokong ungkapan biasa lanjutan, dan GNU grep disertakan secara lalai dalam semua sistem Linux. Perintah Grep digunakan untuk mencari dan mencari sebarang maklumat yang disimpan pada pelayan atau stesen kerja anda.
Ekspresi Biasa

Ekspresi biasa ialah corak yang digunakan untuk memadankan setiap baris input Corak merujuk kepada jujukan aksara. Berikut adalah contoh:

^w1
w1|w2
[^ ]
contoh ungkapan biasa grep

Cari 'vivek' dalam direktori /etc/passswd

grep vivek /etc/passwd

Contoh keluaran:

vivek:x:1000:1000:Vivek Gite,,,:/home/vivek:/bin/bash
vivekgite:x:1001:1001::/home/vivekgite:/bin/sh
gitevivek:x:1002:1002::/home/gitevivek:/bin/sh

Cari vivek dalam apa jua keadaan (iaitu carian tidak sensitif huruf besar)

grep -i -w vivek /etc/passwd

Cari vivek atau raj dalam apa jua keadaan

grep -E -i -w 'vivek|raj' /etc/passwd

Contoh terakhir di atas menunjukkan corak ungkapan biasa lanjutan.

sauh

Anda boleh menggunakan simbol ^ dan $ untuk padanan biasa dengan permulaan atau penghujung baris input. Contoh carian berikut menunjukkan hanya baris input bermula dengan vivek:

grep ^vivek /etc/passwd

Contoh keluaran:

vivek:x:1000:1000:Vivek Gite,,,:/home/vivek:/bin/bash
vivekgite:x:1001:1001::/home/vivekgite:/bin/sh

Anda hanya boleh mencari baris yang bermula dengan perkataan vivek, iaitu, jangan paparkan vivekgit, vivekg, dsb. (terjemahan LCTT: iaitu perkataan diikuti oleh pemisah perkataan Inggeris seperti ruang dan simbol.)

grep -w ^vivek /etc/passwd

Cari baris yang berakhir dengan perkataan perkataan:

grep 'foo$' 文件名

Padanan hanya baris yang mengandungi foo:

grep '^foo$' 文件名

Contoh yang ditunjukkan di bawah boleh mencari baris kosong:

grep '^$' 文件名
Kelas watak

Padankan Vivek atau vivek:

grep '[vV]ivek' 文件名

atau

grep '[vV][iI][Vv][Ee][kK]' 文件名

Boleh juga padankan nombor (iaitu padankan vivek1 atau Vivek2 dll.):

grep -w '[vV]ivek[0-9]' 文件名

Boleh memadankan dua aksara angka (iaitu foo11, foo12, dll.):

grep 'foo[0-9][0-9]' 文件名

Bukan sahaja terhad kepada nombor, malah memadankan sekurang-kurangnya satu huruf:

grep '[A-Za-z]' 文件名

Paparkan semua baris yang mengandungi aksara "w" atau "n":

grep [wn] 文件名

Ungkapan yang diletakkan dalam kurungan, iaitu nama kelas aksara yang disertakan di antara "[:" dan ":]", mewakili senarai semua aksara yang dimiliki oleh kelas ini. Nama kelas aksara standard adalah seperti berikut:

[:alnum:]

- Aksara abjad angka

[:alpha:]

- Aksara abjad

[:blank:]

- Aksara nol: ruang dan tab

[:digit:]

-Nombor: '0 1 2 3 4 5 6 7 8 9'

[:lower:]

- Huruf kecil: 'a b c d e f g h i j k l m n o p q r s t u v w x y z'

[:space:]

- Aksara ruang: tab, suapan baris, tab menegak, suapan borang, pemulangan pengangkutan dan aksara ruang

[:upper:]

- Huruf besar: 'A B C D E F G H I J K L M N O P Q R S T U V W X Y Z'

Dalam contoh yang ditunjukkan ini sepadan dengan semua huruf besar:

grep '[:upper:]' 文件名
Wildcard

Anda boleh menggunakan "." untuk memadankan satu aksara. Contoh itu sepadan dengan perkataan 3 aksara bermula dengan "b" dan berakhir dengan "t":

grep '/<b.t/>' 文件名

di sini,

Padankan rentetan kosong sebelum perkataan
Padan dengan rentetan kosong selepas perkataan

Cetak semua baris dengan hanya dua aksara:

grep '^..$' 文件名

Tunjukkan garisan bermula dengan titik dan nombor:

grep '^/.[0-9]' 文件名
Escape watak titik

Ungkapan biasa berikut untuk memadankan alamat IP 192.168.1.254 adalah salah: (terjemahan LCTT: ia boleh memadankan alamat IP, tetapi ia juga mungkin untuk memadankan format yang serupa di mana simbol spacer bukan titik)

grep '192.168.1.254' /etc/hosts

Kesemua tiga aksara titik perlu dilepaskan:

grep '192/.168/.1/.254' /etc/hosts

Contoh berikut hanya boleh memadankan alamat IP: (terjemahan LCTT: Sebenarnya, disebabkan julat nombor dalam alamat IP, ungkapan biasa ini tidak tepat)

egrep '[[:digit:]]{1,3}/.[[:digit:]]{1,3}/.[[:digit:]]{1,3}/.[[:digit:]]{1,3}' 文件名
Bagaimana untuk mencari corak yang sepadan bermula dengan simbol "-"?

Gunakan pilihan -e untuk mencari padanan rentetan '--test--' Jika anda tidak menggunakan pilihan -e, arahan grep akan cuba menghuraikan '--test--' sebagai parameter pilihannya sendiri:

grep -e '--test--' 文件名
Bagaimana untuk menggunakan padanan "atau" grep?

Gunakan sintaks berikut:

grep -E 'word1|word2' 文件名
或
egrep 'word1|word2' 文件名

atau

grep 'word1/|word2' 文件名
Bagaimana untuk menggunakan padanan "dan" grep?

Gunakan sintaks berikut untuk memaparkan semua baris yang mengandungi 'word1' dan 'word2'

grep 'word1' 文件名 | grep 'word2'
Bagaimana untuk menggunakan pengesanan jujukan?

Menggunakan sintaks berikut, anda boleh mengesan bilangan kali aksara muncul berulang kali dalam urutan:

{N}
{N,}
{min,max}

Untuk memadankan watak "v" yang muncul dua kali:

egrep "v{2}" 文件名

Arahan berikut boleh memadankan "col" dan "cool":

egrep 'co{1,2}l' 文件名

Arahan berikut akan memadankan semua baris dengan sekurang-kurangnya tiga aksara 'c'.

egrep 'c{3,}' 文件名

Contoh di bawah akan sepadan dengan nombor telefon mudah alih dalam format 91-1234567890 (iaitu dua digit - sepuluh digit).

grep "[[:digit:]]/{2/}[ -]/?[[:digit:]]/{10/}" 文件名
Bagaimana untuk menyerlahkan arahan grep?

Gunakan sintaks berikut:

grep --color 正则表达式 文件名
怎么样仅仅只显示匹配出的字符,而不是匹配出的行?

使用如下语法:

grep -o 正则表达式 文件名
正则表达式限定符
限定符 描述
. 匹配任意的一个字符。
? 匹配前面的子表达式,最多一次。
* 匹配前面的子表达式零次或多次。
+ 匹配前面的子表达式一次或多次。
{N} 匹配前面的子表达式 N 次。
{N,} 匹配前面的子表达式 N 次到多次。
{N,M} 匹配前面的子表达式 N 到 M 次,至少 N 次至多 M 次。
- 只要不是在序列开始、结尾或者序列的结束点上,表示序列范围。
^ 匹配一行开始的空字符串;也表示字符不在要匹配的列表中。
$ 匹配一行末尾的空字符串。
\b 匹配一个单词前后的空字符串。
\B 匹配一个单词中间的空字符串。
\< 匹配单词前面的空字符串。
\> 匹配单词后面的空字符串。
grep 和 egrep

egrep 等同于

grep -E

它会以扩展的正则表达式的模式来解释模式。下面来自 grep 的帮助页:

基本的正则表达式元字符 ?、+、 {、 |、 ( 和 ) 已经失去了它们原来的意义,要使用的话用反斜线的版本 /?、/+、/{、/|、/( 和 /) 来代替。 传统的 egrep 并不支持 { 元字符,一些 egrep 的实现是以 /{ 替代的,所以一个可移植的脚本应该避免在 grep -E 使用 { 符号,要匹配字面的 { 应该使用 [}]。

GNU grep -E 试图支持传统的用法,如果 { 出在在无效的间隔规范字符串这前,它就会假定 { 不是特殊字符。

例如,grep -E '{1' 命令搜索包含 {1 两个字符的串,而不会报出正则表达式语法错误。

POSIX.2 标准允许这种操作的扩展,但在可移植脚本文件里应该避免这样使用。

Atas ialah kandungan terperinci Pemahaman mendalam tentang arahan grep: penggunaan ungkapan biasa dalam grep. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:linuxprobe.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam