正则表达式
正则表达式时通常被用来检索和替换那些符合摸个模式的文本内容。它是用单个字符串来描述或替换那些符合某个模式的文本内容
grep
命令:grep
命令格式:grep [选项] ‘word’ filename
选项:
-c :打印符合要求的行数
-n :输出符合要求的行及其行号
-i :表示忽略掉大小写
-v :打印不符合要求的行
-r :遍历所有的目录
-A:后接数字,打印符合要求的行及下面数字行(-A2 ,打印符合要求的行及下面的两行)
-B:后接数字,打印符合要求的行及上面数字行(-B2 ,打印符合要求的行及上面的两行)
-C :后接数字,打印符合要求的行及上下面数字行(-B2 ,打印符合要求的行及上下边的两行)
过滤某个关键词及行号:
[root@shuai-01 grep]# grep -n 'root' passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
某个关键词所在的行数:
[root@shuai-01 grep]# grep -c 'root' passwd
2
过滤不带某个关键词的行:
[root@shuai-01 grep]# grep -nv 'nologin' passwd
1:root:x:0:0:root:/root:/bin/bash
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
22:shuai:x:1000:1000::/home/shuai:/bin/bash
23:user1:x:1001:1001::/home/user1:/bin/bash
24:user2:x:1003:1005::/home/user5:/bin/bash
打印符合要求的行及下两行:
[root@shuai-01 grep]# grep -A2 'root' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
打印符合要求上两行:
[root@shuai-01 grep]# grep -B2 'root' passwd
root:x:0:0:root:/root:/bin/bash
--
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
打印符合要求行及上下两行:
[root@shuai-01 grep]# grep -C2 'root' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp: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
11111111111111
2222222222&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.shadh
shkdjfaldbacjlasdkfnkjsadnc#
# 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:shaonfdjnsjchb
7:akjdhbjkhac
8:ssskjk;lmkldkajsfcipanjkn
9::adljfcajadksh,c
10:11111111111111
11:2222222222&33333333333
12:!2332423434
13::wq
14:
打印不以字母开头的行:
[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,c
11111111111111
2222222222&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,c
11111111111111
2222222222&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' passwd
root:x:0:0:root:/root:/bin/bash
operator: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.txt
i
ii
[root@shuai-01 grep]# egrep 'i*' 1.txt
i
ii
gr
指定要过滤的次数:o要过滤两次
[root@shuai-01 grep]# grep 'o\{2\}' passwd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
[root@shuai-01 grep]# grep -E 'o{2}' passwd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
[root@shuai-01 grep]# egrep 'o{2}' passwd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
过滤字符串1或者2:‘root|nologin’
[root@shuai-01 grep]# egrep 'root|nologin' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin
shell中特殊字符于正则特殊字符对比:
shell中:
‘*’表示零个或多个任意字符
‘?’表示一个任意字符
正则中:
‘*’表示零个或多个前面字符
‘+’表示一个或多个前面字符
‘?’表示零个或一个前面字符
‘.’任意一个字符