第一节:正则表达式
正则符号 |
含义 |
^ |
开头 |
$ |
结尾 |
. |
任意一个字符 |
^$ |
空行 |
* |
匹配前面的字符出现0次或者0次以上 |
.* |
所有 |
\ |
取消特殊字符的含义 |
{n} |
前面的字符匹配n次 |
{n,} |
前面的字符至少匹配n次 |
{n,m} |
前面的字符至少匹配n次,最多匹配m次,n<m |
{,m} |
前面的字符最多匹配m次 |
第二节:grep | egrep 过滤
1.grep相关option
option:
-i 忽略大小写
-v 排除
-n 显示过滤出来的内容所在文件的行号
-c 统计过滤出来的总行数
-w 精确匹配
-o 只显示过滤出来的内容
-E 支持扩展正则
-r 递归过滤
-R 递归过滤
-A 显示出过滤的出来的内容向下多少行
-B 显示出过滤的出来的内容向上多少行
-C 显示出过滤的出来的内容向上或向下多少行
-q 安静模式,不打印任何标准输出。如果有匹配的内容则立即返回状态值0
2.相关参数的用法
1.不区分大小写过滤root -i
[root@lb03 ~]# grep -i 'root' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ROOT
2.过滤出含有root字符串的行数 -C
[root@lb03 ~]# grep -ic 'root' passwd
4
3.过滤出含有root字符串的行,同时显示行号 -n
[root@lb03 ~]# grep -in 'root' passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
22:ROOT
4.过滤出除 /sbin/nologin 字符串的其他行(取反) -v
[root@lb03 ~]# grep -v '/sbin/nologin' passwd
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
ROOT
5.精确过滤 -w
[root@lb03 ~]# grep -iw 'root' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ROOT
6.只显示所过滤的字符串root -o
[root@lb03 ~]# grep -o 'root' passwd
root
root
7.递归过滤 -r
[root@lb03 ~]# grep -r 'root' ./*
./anaconda-ks.cfg:rootpw --iscrypted $6$uxSmIs.46F1YbJYk$W0p9dIjeZPPe556u5YJGhQvOQyEdTk2Q9pHELzfEvDFfUXbKSiyUB9RDAPsfpzSj9BoBXMoyYP87m2qv5xW56/
./anaconda-ks.cfg:pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
./data/oldboy.txt:root
8.过滤出adm字符串的后两行 -A
[root@lb03 ~]# grep -n -A 2 'adm' passwd
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5-lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6-sync:x:5:0:sync:/sbin:/bin/sync
9.过滤出adm字符串的前两行 -B
[root@lb03 ~]# grep -n -B 2 'adm' passwd
2-bin:x:1:1:bin:/bin:/sbin/nologin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
10.过滤出adm字符串的前两行后两行 -C
[root@lb03 ~]# grep -n -C 2 'adm' passwd
2-bin:x:1:1:bin:/bin:/sbin/nologin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5-lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6-sync:x:5:0:sync:/sbin:/bin/sync
3.grep结合正则表达式的用法
1.统计passwd文件中所有字母出现的次数
[root@lb03 ~]# grep -o '[a-Z]' passwd |sort |uniq -c |sort -rn
80 n
77 o
62 s
55 i
42 t
38 b
2.统计passwd文件中所有单词出现的次数
[root@lb03 ~]# grep -Eo '[a-Z]+' passwd |sort |uniq -c |sort -rn
23 sbin
21 x
17 nologin
6 var
5 bin
4 root
3 sync
3 spool
3 shutdown
3.取ip地址
[root@lb03 ~]# ip a s eth0 |grep -w inet | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' |head -1
10.0.0.4
4.取出文件中的身份证号码
[root@lb03 ~]# grep -Ew '[0-9]{17}[0-9X]' id.txt
邹 371481199403259478
莫 52020319810613433X
荣 530124197504135438
阮 360702197902169951
第三节:sed流编辑器
1.sed的工作模式
2.sed的相关选项即参数
选项:
-n 取消默认输出
-i 修改文件内容
-r 支持扩展正则
-e 允许多项编辑
内部命令
a 追加
i 插入
s 替换
g 全局
p 打印
d 删除
i 忽略大小写
c 原位置替换
h
H
g
G
3.sed用法
1.显示单行
[root@lb03 ~]# sed -n '1p' passwd
2.显示连续的多行
[root@lb03 ~]# sed -n '1,3p' passwd
3.显示不连续的多行
[root@lb03 ~]# sed -n '1p;3p' passwd
[root@lb03 ~]# sed -n '$p' passwd
4.过滤字符串
[root@lb03 ~]# sed -n '/root/p' passwd
5.过滤以root开头
[root@lb03 ~]# sed -n '/^root/p' passwd
[root@lb03 ~]# sed -n '/^ROOT/p' passwd
6.过滤以t为结尾的行
[root@lb03 ~]# sed -n '/t$/p' passwd
7.过滤出字符连续的行
[root@lb03 ~]# sed -n '/adm/,/ftp/p' passwd
8.取出不同的字符串
[root@lb03 ~]# sed -n '/adm/p;/ftp/p' passwd
[root@lb03 ~]# sed -rn '/adm|ftp/p' passwd
9.删除1行
[root@lb03 ~]# sed '1d' passwd
10.删除连续的多行
[root@lb03 ~]# sed '1,20d' passwd
11.删除整个文件
[root@lb03 ~]# sed '1,$d' passwd
12.删除不连续的多行
[root@lb03 ~]# sed '1d;3d' passwd
13.在某一行的后面追加内容
[root@lb03 ~]# sed '1aoldboy' test.txt
14.在某一行的前面追加内容
[root@lb03 ~]# sed '1ioldboy' test.txt
15.在文件的开头添加内容
[root@lb03 ~]# sed '1s/^/oldboy\n/' test.txt
16.在文件的结尾加入内容
[root@lb03 ~]# sed '$s/$/\noldgirl/' test.txt
4.sed的替换用法
1.全局替换
[root@lb03 ~]# sed 's#root#admin#g' test.txt
2.替换多行
[root@lb03 ~]# sed '1,5s#bin#shell#g' test.txt
3.只替换每一行第一个匹配的
[root@lb03 ~]# sed '1,5s#bin#shell#' test.txt
4.根据字符串匹配进行替换
[root@lb03 ~]# sed '/^root/s#root#admin#g' test.txt
5.忽略大小写替换
[root@lb03 ~]# sed 's#root#admin#gi' test.txt
-c 原位置替换 (按行进行替换)
6.匹配第一行进行替换
[root@lb03 ~]# sed '1cadmin' test.txt
7.包含匹配字符串的行全部替换
[root@lb03 ~]# sed '/root/cadmin' test.txt
[root@lb03 ~]# sed '7cSELINUX=enforcing' /etc/sysconfig/selinux
[root@lb03 ~]# sed '/^SELINUX=/cSELINUX=enforcing' /etc/sysconfig/selinux
[root@lb03 ~]# sed '/^#Port/cPort 666' /etc/ssh/sshd_config
[root@lb03 ~]# sed '17cPort 666' /etc/ssh/sshd_config
[root@web ~]# sed '/^user/cuser www;' /etc/nginx/nginx.conf
8.将文本中的换行符替换成空格
[root@lb01 ~/scripts/02]# cat url.txt
www.baidu.com
www.taobao.com
www.mysun.com
[root@lb01 ~/scripts/02]# sed ':label;N;s/\n/ /;b label' url.txt
www.baidu.com www.taobao.com www.mysun.com
w #将内容写到新的文件中
[root@lb03 ~]# sed -n '/root/w file.txt' passwd
[root@lb03 ~]# sed -n '1w file1.txt' passwd
e #允许多项编辑
[root@lb03 ~]# sed '1,10d' passwd |sed 's#root#123#g'
[root@lb03 ~]# sed -e '1,10d' -e 's#root#123#g' passwd
n #读入下一输入行,从下一条命令进行处理(对下一行进行n之后的处理)
[root@lb03 ~]# sed '/root/{n;d}' passwd
[root@lb03 ~]# sed '/root/{n; s/bin/123/}' passwd
! #非
[root@lb03 ~]# sed -n '1!p' passwd
[root@lb03 ~]# sed '1!d' passwd
#显示行号
[root@lb03 ~]# sed = passwd
#对文件进行编辑的同时备份原文件(文件名以.bak结尾)
[root@lb03 ~]# sed -i.bak '1,$d' passwd
5.sed的高级用法
内部命令:
h #把模式空间里的内容重定向到暂存缓冲区
H #把模式空间里的内容追加到暂存缓冲区
g #取出暂存缓冲区的内容,将其复制到模式空间,覆盖该处原有内容
G #取出暂存缓冲区的内容,将其复制到模式空间,追加在原有内容后面
用法:
1.将第一行的写入到暂存区, 替换最后一行的内容
[root@lb03 ~]# sed '1h;$g' file.txt
2.将第一行的写入到暂存区, 在最后一行调用暂存区的内容
[root@lb03 ~]# sed '1h;$G' file.txt
3.将第一行的内容删除但保留至暂存区, 在最后一行调用暂存区内容追加至于尾部
[root@lb03 ~]# sed '1{H;d};$G' file.txt
4.将第一行的内容写入至暂存区, 从第二行开始进行重定向替换
[root@lb03 ~]# sed '1h;2,$g' file.txt
5.将第一行重定向至暂存区, 2-3行追加至暂存区, 最后追加调用暂存区的内容
[root@lb03 ~]# sed '1h;2,3H;$G' file.txt
6.sed给文件添加注释
1.为格式规范的文本添加注释
[root@lb03 ~]# sed 's#^#\##g' file.txt
2.为格式杂乱的文本添加注释
原文本:
[root@lb03 ~]# cat file.txt
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
sync:x:5:0:sync:/sbin:/bin/sync
# shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
进行添加注释:
[root@lb03 ~]# sed 's/^[ \t#]*/#/g' file.txt
#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
#sync:x:5:0:sync:/sbin:/bin/sync
#shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
#halt:x:7:0:halt:/sbin:/sbin/halt
3.把passwd文件中的第一列与第七列进行位置调换(后向引用)
[root@lb03 ~]# sed -r 's#(.*)(:x.*:)(.*)#\3\2\1#g' passwd
/bin/bash:x:0:0:root:/root:root
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon
网友评论