正则表达式,grep/egrep

时间:2023-01-22 08:55:57

正则表达式

正则表达式时通常被用来检索和替换那些符合摸个模式的文本内容。它是用单个字符串来描述或替换那些符合某个模式的文本内容

grep

命令:grep 
命令格式:grep [选项] ‘word’ filename 
选项: 
-c :打印符合要求的行数 
-n :输出符合要求的行及其行号 
-i :表示忽略掉大小写 
-v :打印不符合要求的行 
-r :遍历所有的目录 
-A:后接数字,打印符合要求的行及下面数字行(-A2 ,打印符合要求的行及下面的两行) 
-B:后接数字,打印符合要求的行及上面数字行(-B2 ,打印符合要求的行及上面的两行) 
-C :后接数字,打印符合要求的行及上下面数字行(-B2 ,打印符合要求的行及上下边的两行)

过滤某个关键词及行号:

[root@shuai-01 grep]# grep -n 'root' passwd1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin

某个关键词所在的行数:

[root@shuai-01 grep]# grep -c 'root' passwd2

过滤不带某个关键词的行:

[root@shuai-01 grep]# grep -nv 'nologin' passwd1:root:x:0:0:root:/root:/bin/bash6:sync:x:5:0:sync:/sbin:/bin/sync7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8:halt:x:7:0:halt:/sbin:/sbin/halt22:shuai:x:1000:1000::/home/shuai:/bin/bash23:user1:x:1001:1001::/home/user1:/bin/bash24:user2:x:1003:1005::/home/user5:/bin/bash

打印符合要求的行及下两行:

[root@shuai-01 grep]# grep -A2 'root' passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin--operator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

打印符合要求上两行:

[root@shuai-01 grep]# grep -B2 'root' passwdroot:x:0:0:root:/root:/bin/bash--halt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologin

打印符合要求行及上下两行:

[root@shuai-01 grep]# grep -C2 'root' passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin--halt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

正则表达式

在正则表达式中,“^”表示行的开始, 
$表示行的结尾,

空行可以用“^$”表示。而中括号”[]”,如[0-9]表示数字0到9,[a-z] 表示字母a到z, [^0-9] 表示不是数字。要是^[^0-9] 表示不是以数字0到9做开头。 
一个写正则博客,写的很好: 
https://my.oschina.net/u/3497124/blog/1137725

几个正则表达式和grep结合的用法

打印有数字的行:

[root@shuai-01 grep]# grep '[0-9]' inittab 111111111111112222222222&33333333333!2332423434# multi-user.target: analogous to runlevel 3# graphical.target: analogous to runlevel 5

打印没有数字的行:

[root@shuai-01 grep]# grep -v '[0-9]' inittab # inittab is no longer used when using systemd.shadhshkdjfaldbacjlasdkfnkjsadnc## ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.## Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target

打印不以#号开头的行及行号:

[root@shuai-01 grep]# grep -nv '^#' inittab 2:shkdjfaldbacjlasdkfnkjsadnc#6:shaonfdjnsjchb7:akjdhbjkhac8:ssskjk;lmkldkajsfcipanjkn9::adljfcajadksh,c10:1111111111111111:2222222222&3333333333312:!233242343413::wq14:

打印不以字母开头的行:

[root@shuai-01 grep]# grep -v '^[a-zA-Z]' inittab # inittab is no longer used when using systemd.shadh# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.## Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target:adljfcajadksh,c111111111111112222222222&33333333333!2332423434:wq[root@shuai-01 grep]# grep '^[^a-zA-Z]' inittab # inittab is no longer used when using systemd.shadh# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.## Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target:adljfcajadksh,c111111111111112222222222&33333333333!2332423434:wq

在正则表达式中: 
“ . ”表示任意一个字符 
“ * ”表示零个或多个前面的字符。如:’i*’ 表示零个或多个i 
“ .* ”表示零个或多个任意字符 
“ {} ”内部为数字,表示前面字符重复的次数。如:’g{2}’表示g重复两次。’g{1,3}’ 表示g重复两到三次 
“ + ”表示一次或多次前面的字符。如’i+’ 表示一个或多个i 
“ ? ”表示零个或一个?前面的字符 
“ | ”表示或者的意思 。如’aaa|iii’表示aaa或者iii

过滤r和o中有一个任意的字符:

[root@shuai-01 grep]# grep 'r.o' passwdroot:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologin

‘*’和‘+’比较:‘ii+’表示 ii ,iii , i…… 
‘ii*’表示i,ii,iii ,i…. 
这个你要将特殊字符和前面的一个字符看成一个整体,i(i+),i(i*)

[root@shuai-01 grep]# egrep 'i+' 1.txtiii[root@shuai-01 grep]# egrep 'i*' 1.txtiiigr

指定要过滤的次数:o要过滤两次

[root@shuai-01 grep]# grep 'o\{2\}' passwdroot:x:0:0:root:/root:/bin/bashlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologin[root@shuai-01 grep]# grep -E 'o{2}' passwdroot:x:0:0:root:/root:/bin/bashlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologin[root@shuai-01 grep]# egrep 'o{2}' passwdroot:x:0:0:root:/root:/bin/bashlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologin

过滤字符串1或者2:‘root|nologin’

[root@shuai-01 grep]# egrep 'root|nologin' passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologinnobody:x:99:99:Nobody:/:/sbin/nologinsystemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologinsystemd-network:x:192:192:systemd Network Management:/:/sbin/nologindbus:x:81:81:System message bus:/:/sbin/nologinpolkitd:x:998:996:User for polkitd:/:/sbin/nologintss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologinsshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologinchrony:x:997:995::/var/lib/chrony:/sbin/nologin

shell中特殊字符于正则特殊字符对比:

shell中: 
‘*’表示零个或多个任意字符 
‘?’表示一个任意字符 
正则中: 
‘*’表示零个或多个前面字符 
‘+’表示一个或多个前面字符 
‘?’表示零个或一个前面字符 
‘.’任意一个字符