正则表达式与grep、sed工具使用简介
一、正则表达式
其介绍如下:
\
将下一个字符标记符、或一个向后引用、或一个八进制转义符
^
匹配输入字符串的开始位置
$
匹配输入字符串的结束位置
*
匹配前面的子表达式任意次
+
匹配前面的子表达式一次或多次(大于等于1次)
?
匹配前面的子表达式零次或一次
{n}
n是一个非负整数
匹配确定的n次
{n,}
至少匹配n次
{n,m}
m和n均为非负整
数其中n<=m。最少匹配n次且最多匹配m次
.
匹配除“\r\n”之外的任何单个字符
x|y
匹配x或y
[xyz]
字符集合。匹配所包含的任意一个字符
[^xyz]
负值字符集
合匹配未包含的任意字符
[a-z]
字符范围。匹配指定范围内的任意字符
[^a-z]
负值字符范围。匹配任何不在指定范围内的任意字符
[A-Z]
大写字母集
( )
定义组,可以用\1、\2等引用
\b
匹配一个单词边界
\B
匹配非单词边界
\d
匹配一个数字字符
\D
匹配一个非数字字符
\n
匹配一个换行符
\r
匹配一个回车符
\s
匹配任何不可见字符
\S
匹配任何可见字符
\t
匹配一个制表符
\v
匹配一个垂直制表符
\w
匹配包括下划线的任何单词字符
\W
匹配任何非单词字符
\f
匹配一个换页符
二、grep介绍与用法
grep的选项:
-n 显示行号
-o 只显示匹配的内容
-q 没有任何输出,即静默模式
-I 如果匹配成功只将文件名打印出来
-A 2 如果匹配成功将其后两行一起打印出来不带数字打印一行
-B 2 如果匹配成功将其前两行一起打印出来不带数字打印一行
-C 2 如果匹配成功将其前后两行一起打印出来不带数字打印一行
--color 带颜色打印
-c count即将匹配到的行数打印出来
-E 相当于egrep
-i 不区分大小写
-v 取反,即不匹配
-w 匹配单词
练习:
目标文件/etc/passwd,使用grep命令或egrep
1.显示出所有含有root的行:
<a href="https://s3.51cto.com/wyfs02/M00/8F/0D/wKiom1jSL_6TGCRqAAAx-no2niI418.png-wh_500x0-wm_3-wmp_4-s_3938902023.png" target="_blank"></a>
2.输出任何包含bash的所有行,还要输出紧接着这行的上下各两行的内容:
3. 显示出有多少行含有nologin。
<a href="https://s2.51cto.com/wyfs02/M00/8F/0B/wKioL1jSMNiiak_HAAARpJxHOUc363.png-wh_500x0-wm_3-wmp_4-s_296071668.png" target="_blank"></a>
4.显示出那些行含有root,并将行号一块输出。
<a href="https://s2.51cto.com/wyfs02/M00/8F/0D/wKiom1jSMQfxfbrdAAAgN8cR_o4467.png-wh_500x0-wm_3-wmp_4-s_2587489190.png" target="_blank"></a>
5.显示出文件
<a href="https://s2.51cto.com/wyfs02/M01/8F/0D/wKiom1jSMTGiKMgaAAAVPgt98Ws567.png-wh_500x0-wm_3-wmp_4-s_3436616209.png" target="_blank"></a>
6.新建用户
abominable
abominate
anomie
atomize
编写正则表达式,将他们匹配出来
<a href="https://s3.51cto.com/wyfs02/M00/8F/0B/wKioL1jSN0jRB9AlAAA_w5Wty98229.png-wh_500x0-wm_3-wmp_4-s_3403521230.png" target="_blank"></a>
7.建四个用户
Alex213sb
Wpq2222b
yH438PIG
egon666
egon
过滤出用户名组成是字母+数字+字母的行
<a href="https://s4.51cto.com/wyfs02/M02/8F/0B/wKioL1jSOhjwBbNzAABAqY3BcEc459.png-wh_500x0-wm_3-wmp_4-s_944978490.png" target="_blank"></a>
8.显示出/etc目录下所有包含root的文件名
9. 过滤掉/etc/ssh/sshd_config内所有注释和所有空行
<a href="https://s2.51cto.com/wyfs02/M01/8F/0C/wKioL1jSRHSAG4GAAADHHVonvrE061.png-wh_500x0-wm_3-wmp_4-s_4038545495.png" target="_blank"></a>
三、sed的介绍与用法
sed 是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
sed [-nefr] [command]
选项与参数:
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。
command:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
d :删除,因为是删除啊,所以 d 后面通常不接任何东西
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
s :取代,可以直接进行替换的功能,通常这个 s 的动作可以搭配正规表示法 例如 1,20s/旧字符串/新字符串/g
以/etc/passwd文件为模板
1,删除文件每行的第一个字符。
<a href="https://s3.51cto.com/wyfs02/M02/8F/0F/wKiom1jSU62gM58vAADGkdQovMQ626.png-wh_500x0-wm_3-wmp_4-s_2542138768.png" target="_blank"></a>
2,删除文件每行的第二个字符。
<a href="https://s4.51cto.com/wyfs02/M01/8F/0C/wKioL1jSVI2zd0_vAABuH8bOZ5w952.png-wh_500x0-wm_3-wmp_4-s_1942284069.png" target="_blank"></a>
3,删除文件每行的最后一个字符。
<a href="https://s3.51cto.com/wyfs02/M00/8F/0F/wKiom1jSVN7S4ud1AABvkye9-v8056.png-wh_500x0-wm_3-wmp_4-s_764772418.png" target="_blank"></a>
4,删除文件每行的倒数第二个字符。
<a href="https://s3.51cto.com/wyfs02/M00/8F/0F/wKiom1jSVS6hFnePAABu7IvACms779.png-wh_500x0-wm_3-wmp_4-s_3074137360.png" target="_blank"></a>
5,删除文件每行的第二个单词。
<a href="https://s1.51cto.com/wyfs02/M01/8F/0D/wKioL1jSV4Kg0OOnAACaOWQadIM902.png-wh_500x0-wm_3-wmp_4-s_1011328415.png" target="_blank"></a>
6,删除文件每行的倒数第二个单词。
<a href="https://s5.51cto.com/wyfs02/M02/8F/0F/wKiom1jSWImBgAYvAABj5IrLO8Y824.png-wh_500x0-wm_3-wmp_4-s_4138013003.png" target="_blank"></a>
7,删除文件每行的最后一个单词。
<a href="https://s4.51cto.com/wyfs02/M00/8F/0F/wKiom1jSWLmx_lodAABuDNJuKb0028.png-wh_500x0-wm_3-wmp_4-s_2084132930.png" target="_blank"></a>
8,交换每行的第一个字符和第二个字符。
<a href="https://s5.51cto.com/wyfs02/M01/8F/0F/wKiom1jSWTbBdwjHAACABwuwLQM176.png-wh_500x0-wm_3-wmp_4-s_1460897526.png" target="_blank"></a>
9,交换每行的第一个字符和第二个单词。
<a href="https://s3.51cto.com/wyfs02/M00/8F/0F/wKiom1jSWrSyMpTdAADF-mnQ9lM044.png-wh_500x0-wm_3-wmp_4-s_370545484.png" target="_blank"></a>
10,交换每行的第一个单词和最后一个单词。
<a href="https://s2.51cto.com/wyfs02/M02/8F/0D/wKioL1jSXCeAz0kDAACENh54eRs829.png-wh_500x0-wm_3-wmp_4-s_1353857043.png" target="_blank"></a>
11,删除一个文件中所有的数字。
<a href="https://s1.51cto.com/wyfs02/M00/8F/0F/wKiom1jSXJPRROKVAACXrWSyK08675.png-wh_500x0-wm_3-wmp_4-s_4110002114.png" target="_blank"></a>
12,删除每行开头的所有空格。
<a href="https://s3.51cto.com/wyfs02/M00/8F/0D/wKioL1jSXYrznwsKAABirmmWM4M205.png-wh_500x0-wm_3-wmp_4-s_3965667132.png" target="_blank"></a>
13,用制表符替换文件中出现的所有空格。
<a href="https://s5.51cto.com/wyfs02/M01/8F/0F/wKiom1jSXeLxV6oCAACLfMthc9o274.png-wh_500x0-wm_3-wmp_4-s_4130006748.png" target="_blank"></a>
14,把所有大写字母用括号()括起来。
<a href="https://s3.51cto.com/wyfs02/M00/8F/0D/wKioL1jSXruADo9-AAB_jw-X5Go111.png-wh_500x0-wm_3-wmp_4-s_3274685327.png" target="_blank"></a>
15,打印每行3次。
<a href="https://s2.51cto.com/wyfs02/M00/8F/0F/wKiom1jSYemQhYqtAACALRZjFHg155.png-wh_500x0-wm_3-wmp_4-s_360292407.png" target="_blank"></a>
16,只显示每行的第一个单词。
<a href="https://s5.51cto.com/wyfs02/M00/8F/0D/wKioL1jSYrTDD6a2AABCfp7fLfQ732.png-wh_500x0-wm_3-wmp_4-s_3243362359.png" target="_blank"></a>
18,用命令获取格式为 mm/yy/dd 的日期格式,结合管道,将其换成 mm;yy;dd格式
<a href="https://s1.51cto.com/wyfs02/M02/8F/0F/wKiom1jSZ9HTkxLNAAAegeQb1hw583.png-wh_500x0-wm_3-wmp_4-s_4253479773.png" target="_blank"></a>
本文转自 AltBoy 51CTO博客,原文链接:http://blog.51cto.com/altboy/1909354