Maison  >  Article  >  Opération et maintenance  >  Explication détaillée des caractères génériques et des expressions régulières sous Linux (image)

Explication détaillée des caractères génériques et des expressions régulières sous Linux (image)

黄舟
黄舟original
2017-05-27 10:23:561972parcourir

L'

Regularexpression correspond à la chaîne qualifiée dans le fichier. Cet article vous présentera le joker et les expressions régulières sous linux. Les amis qui en ont besoin peuvent se référer à

wildcard <.>

* N'importe quel caractère, peut être répété plusieurs fois

? N'importe quel caractère, répété une fois
[] représente un caractère

Exemple : [a,b,c] signifie Tout caractère générique

dans abc est utilisé pour correspondre à l'expression régulière

du nom de fichier

expression régulière

ls find cp ne prend pas en charge les expressions régulières

, mais grep awk sed prend en charge les expressions régulières

[root@hadoop-bigdata01 test]# touch aa
[root@hadoop-bigdata01 test]# touch aab aabb
[root@hadoop-bigdata01 test]# ll
total 0
-rw-r--r-- 1 root root 0 May 16 19:47 aa
-rw-r--r-- 1 root root 0 May 16 19:47 aab
-rw-r--r-- 1 root root 0 May 16 19:47 aabb
[root@hadoop-bigdata01 test]# ls aa
aa
[root@hadoop-bigdata01 test]# ls aa?
aab
[root@hadoop-bigdata01 test]# ls aa*
aa  aab  aabb
Expression régulière

Caractères spéciaux

Plage de correspondance d'expression régulière

Standard d'expression régulière Les caractères

utilisent l'expression régulière

 grep "1" /etc/passwd
pour inclure la ligne contenant le mot-clé 1. Grep doit seulement l'inclure. Vous ne voulez pas de caractères génériques et doit être complètement cohérent.

[root@hadoop-bigdata01 test]# grep "1" /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
wang:x:501:501::/home/wang:/bin/bash
grep 'root' /etc/passwd
cat /etc/passwd | grep 'root'
sont les mêmes, mais les le caractère pipe consomme plus de ressources

Donc

1. Faire correspondre les lignes contenant des nombres

  grep &#39;[0-9]&#39; /etc/passwd
2. Faire correspondre les lignes contenant trois nombres consécutifs

 grep &#39;[0-9][0-9][0-9]&#39; /etc/passwd      或者  grep &#39;:[0-9][0-9][0-9]:&#39; /etc/passwd
.
[root@hadoop-bigdata01 test]# grep &#39;[0-9][0-9][0-9]&#39; /etc/passwd
games:x:12:100:games:/usr/games:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
saslauth:x:498:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
liucheng:x:500:500::/home/liucheng:/bin/bash
wang:x:501:501::/home/wang:/bin/bas

3. Faire correspondre les lignes commençant par r et se terminant par n

 grep &#39;^r.*n$&#39; /etc/passwd
.*代表所有
[root@hadoop-bigdata01 test]# grep &#39;^r.*n$&#39; /etc/passwd        
rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin

4. Filtrer ifconfig, intercepter ip

grep -v représente l'interception inversée, ce qui signifie supprimer les lignes avec un certain mot-clé sed signifie remplacement

[root@hadoop-bigdata01 test]# ifconfig | grep &#39;inet addr:&#39;
     inet addr:192.168.126.191 Bcast:192.168.126.255 Mask:255.255.255.0
     inet addr:127.0.0.1 Mask:255.0.0.0
[root@hadoop-bigdata01 test]# 
[root@hadoop-bigdata01 test]# ifconfig | grep &#39;inet addr:&#39; | grep -v &#39;127.0.0.1&#39;
     inet addr:192.168.126.191 Bcast:192.168.126.255 Mask:255.255.255.0
[root@hadoop-bigdata01 test]# ifconfig | grep &#39;inet addr:&#39; | grep -v &#39;127.0.0.1&#39; | sed &#39;s/inet addr://g&#39;
     192.168.126.191 Bcast:192.168.126.255 Mask:255.255.255.0
[root@hadoop-bigdata01 test]# ifconfig | grep &#39;inet addr:&#39; | grep -v &#39;127.0.0.1&#39; | sed &#39;s/inet addr://g&#39; | sed &#39;s/Bcast.*//g&#39;
     192.168.126.191

Malentendu

Il y a un malentendu ici. J'y réfléchis depuis longtemps. C'est la différence entre les expressions régulières et les caractères génériques

Nous savons que la * signification des caractères génériques est n'importe quel caractère et peut être répétée. plusieurs fois. Le * dans l'expression régulière fait référence à la correspondance du caractère précédent >= 0 fois

. Alors, comment puis-je savoir si le * que j'utilise est un caractère générique ou un caractère générique ? Expression

Au début, je suis tombé dans un malentendu. Regardez la série de commandes suivante

[root@hadoop-bigdata01 test]# touch ac aac abc abbc
[root@hadoop-bigdata01 test]# ll
total 0
-rw-r--r-- 1 root root 0 May 16 19:55 aac
-rw-r--r-- 1 root root 0 May 16 19:55 abbc
-rw-r--r-- 1 root root 0 May 16 19:55 abc
-rw-r--r-- 1 root root 0 May 16 19:55 ac
[root@hadoop-bigdata01 test]# ls | grep &#39;a*c&#39;
aac
abbc
abc
ac
[root@hadoop-bigdata01 test]# ls | grep &#39;a.*c&#39;
aac
abbc
abc
ac
[root@hadoop-bigdata01 test]# ls | grep &#39;^a.*c&#39;
aac
abbc
abc
ac
[root@hadoop-bigdata01 test]# ls | grep &#39;^a*c&#39; 
aac
ac
Pourquoi les résultats de grep 'a*c' et grep '^a*c$. ' différent ? , je pensais que l'un était un caractère générique et l'autre une expression régulière, car les quatre résultats affichés par a*c

correspondaient à n'importe quel nombre de caractères

 ? ce n'est pas le cas

Le rôle des caractères génériques est de faire correspondre les noms de fichiers

Les expressions régulières doivent correspondre aux chaînes qualifiées dans les fichiers

L'utilisation de grep après l'avoir passé au caractère pipe n'est pas ne correspondant plus aux noms de fichiers. , il s'agit d'une opération sur les fichiers, donc c'est complètement une expression régulière

grep 'a*c' signifie correspondre à a>=0, donc tant qu'il contient c, c'est OK.

Et grep '^a*c$' est aussi une expression régulière, ce qui signifie qu'elle commence par a, et le deuxième caractère correspond à zéro ou plusieurs fois, suivi de la lettre c

, donc il n'y a que aac et ac Remplit les conditions

Alors regarde cet exemple

[root@hadoop-bigdata01 test]# ls
a aac abb abbc abc ac b bb c cb
[root@hadoop-bigdata01 test]# ls | grep &#39;a*b&#39;
abb
abbc
abc
b
bb
cb
Ici grep 'a*b' ne veut pas dire qu'il contient a et b, mais que a est répété 0 fois ou plus et contient ensuite b

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn