Maison  >  Article  >  Tutoriel système  >  Compréhension approfondie de la commande grep : application des expressions régulières dans grep

Compréhension approfondie de la commande grep : application des expressions régulières dans grep

PHPz
PHPzavant
2024-01-13 13:30:21785parcourir
Présentation Comment utiliser les expressions régulières de la commande Grep dans les systèmes Linux et Unix ? Linux est livré avec l'outil de commande GNU grep, qui prend en charge les expressions régulières étendues, et GNU grep est inclus par défaut dans tous les systèmes Linux. La commande Grep est utilisée pour rechercher et localiser toute information stockée sur votre serveur ou poste de travail.
Expressions régulières

L'expression régulière est un modèle utilisé pour faire correspondre chaque ligne d'entrée. Le modèle fait référence à une séquence de caractères. Voici un exemple :

^w1
w1|w2
[^ ]
exemple d'expression régulière grep

Recherchez « vivek » dans le répertoire /etc/passswd

grep vivek /etc/passwd

Exemple de sortie :

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

Recherchez vivek dans tous les cas (c'est-à-dire recherche insensible à la casse)

grep -i -w vivek /etc/passwd

Recherchez vivek ou raj dans tous les cas

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

Le dernier exemple ci-dessus montre un modèle d'expression régulière étendu.

ancre

Vous pouvez utiliser les symboles ^ et $ pour faire correspondre régulièrement le début ou la fin de la ligne de saisie. L'exemple de recherche suivant affiche uniquement les lignes de saisie commençant par vivek :

grep ^vivek /etc/passwd

Exemple de sortie :

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

Vous ne pouvez rechercher que des lignes commençant par le mot vivek, c'est-à-dire ne pas afficher vivekgit, vivekg, etc. (traduction LCTT : c'est-à-dire que le mot est suivi de séparateurs de mots anglais tels que des espaces, des symboles, etc.)

grep -w ^vivek /etc/passwd

Trouver les lignes se terminant par le mot mot :

grep 'foo$' 文件名

Correspond uniquement aux lignes contenant foo :

grep '^foo$' 文件名

L'exemple ci-dessous permet de rechercher des lignes vides :

grep '^$' 文件名
Classe de personnage

Match Vivek ou vivek :

grep '[vV]ivek' 文件名

ou

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

Peut également faire correspondre des nombres (c'est-à-dire correspondre à vivek1 ou Vivek2, etc.) :

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

Peut correspondre à deux caractères numériques (c'est-à-dire foo11, foo12, etc.) :

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

Non seulement limité aux chiffres, mais aussi correspondant à au moins une lettre :

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

Afficher toutes les lignes contenant des caractères "w" ou "n" :

grep [wn] 文件名

L'expression placée entre parenthèses, c'est-à-dire le nom de la classe de caractères entre "[:" et ":]", représente une liste de tous les caractères appartenant à cette classe. Les noms de classes de caractères standard sont les suivants :

[:alnum:]

- Caractères alphanumériques

[:alpha:]

- Caractères alphabétiques

[:blank:]

- Caractères nuls : espace et tabulation

[:digit:]

-Numéro : '0 1 2 3 4 5 6 7 8 9'

[:lower:]

- Lettres minuscules : '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:]

- Caractères d'espacement : tabulation, saut de ligne, tabulation verticale, saut de page, retour chariot et caractère espace

[:upper:]

- Lettres majuscules : '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'

Dans cet exemple, toutes les lettres majuscules correspondent :

grep '[:upper:]' 文件名
Carte générique

Vous pouvez utiliser "." pour faire correspondre un seul caractère. L'exemple correspond à des mots de 3 caractères commençant par "b" et se terminant par "t" :

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

ici,

Faire correspondre la chaîne vide avant le mot
Correspond à la chaîne vide après le mot

Imprimez toutes les lignes avec seulement deux caractères :

grep '^..$' 文件名

Afficher les lignes commençant par un point et un chiffre :

grep '^/.[0-9]' 文件名
Évasion du personnage Dot

L'expression régulière suivante pour correspondre à l'adresse IP 192.168.1.254 est incorrecte : (traduction LCTT : elle peut correspondre à l'adresse IP, mais il est également possible de faire correspondre des formats similaires où le symbole d'espacement n'est pas un point)

grep '192.168.1.254' /etc/hosts

Les trois caractères points doivent être échappés :

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

L'exemple suivant ne peut correspondre qu'aux adresses IP : (traduction LCTT : en fait, en raison de la plage de nombres dans l'adresse IP, cette expression régulière n'est pas exacte)

egrep '[[:digit:]]{1,3}/.[[:digit:]]{1,3}/.[[:digit:]]{1,3}/.[[:digit:]]{1,3}' 文件名
Comment rechercher des modèles correspondants commençant par le symbole "-" ?

Utilisez l'option -e pour rechercher la chaîne correspondant à '--test--'. Si vous n'utilisez pas l'option -e, la commande grep tentera d'analyser '--test--' comme son propre paramètre d'option :

grep -e '--test--' 文件名
Comment utiliser la correspondance « ou » de grep ?

Utilisez la syntaxe suivante :

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

ou

grep 'word1/|word2' 文件名
Comment utiliser la correspondance « et » de grep ?

Utilisez la syntaxe suivante pour afficher toutes les lignes contenant à la fois « mot1 » et « mot2 »

grep 'word1' 文件名 | grep 'word2'
Comment utiliser la détection de séquence ?

En utilisant la syntaxe suivante, vous pouvez détecter le nombre de fois qu'un caractère apparaît de manière répétée dans une séquence :

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

Pour faire correspondre le caractère "v" apparaissant deux fois :

egrep "v{2}" 文件名

La commande suivante peut correspondre à "col" et "cool" :

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

La commande suivante fera correspondre toutes les lignes contenant au moins trois caractères « c ».

egrep 'c{3,}' 文件名

L'exemple ci-dessous fera correspondre les numéros de téléphone mobile au format 91-1234567890 (c'est-à-dire deux chiffres - dix chiffres).

grep "[[:digit:]]/{2/}[ -]/?[[:digit:]]/{10/}" 文件名
Comment mettre en surbrillance la commande grep ?

Utilisez la syntaxe suivante :

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 标准允许这种操作的扩展,但在可移植脚本文件里应该避免这样使用。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer