正则表达式

正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法

正则表达式主要用于查找符合某些复杂规则的字符串

在linux中,通配符是由shell解释的,而正则表达式则是由命令解释的,文本处理工具有grep、sed

1 grep

grep 文本处理工具

下面是grep的参数

-n 显示内容的行号
-0 只显示内容
-q 静默  不显示
    echo $? 返回0证明执行
-l 文件名
-A 5 返回该内容以及该内容的后5行(通常用于显示错误日志的内容,错误内容的前后信息)
-B 3 返回该内容以及该内容的前3行
-C 2 返回该内容以及该内容的上下两行
-c  行数(count数量)
-E==egrep  (以后用grep)
-i 忽略大小写
-v 取反
-w 单词

2 正则表达式的规则

^
行首

gerp '^root'  匹配root开头的

$
行尾部

gerp 'bash$'   匹配bash结尾的 能都登录的

.
任意一个字符

gerp '^.' 查找任意字符开头的

gerp '^b.n' 

*
前面的字符有0个到无穷个

*前面紧贴的字符

左边那一个字符

+
不能直接用grep,这是扩展正则用egrep

egrep gerp -e 

左边 有一个到无穷个

 左边那一个字符

{}
匹配前面字符的数量

内部可以指定数量

'ab{2,4}' 指定范围

'ab{2,}' 2-无穷

- 
1
egrep -w 'ab{3}' a.txt 匹配单词


左边出现0次或者1次

[]
取其中的一个

egrep 

[asdfasdt123456\-]

需要转义

-放到结尾 需要匹配-本身

[a-z]小写字母

[A-Z]大写字母

[a-zA-Z]==[a-Z]小写大写字母

[0-9]

[0-9]+    左边的字符有一个或者无穷个

^[0-9]  取开头是数字的

^[^0-9]取反

3 sed stream editor 流编辑器

过滤一行的内容  1 定位 2 处理

    -n 不打印 静默

    -e '' -e '' 处理多个

    -i 对文件本身修改

    -f 规则写入文件

定位 '1' 用数字代表行

    '3d' 删除第3行 实际文件没有写入

    ‘3p’打印第三行再打印一次

    -n '3p'只打印第三行

    ‘3c 1111111’ 第三行改成1111111打印,其他行不变

    ‘3a  11111’  第三行后面追加

    ‘3i 111’  插入在原来第三行的前面

正则定位:

    sed
        '/^root/d' test.txt 删除root 开头

        ‘1,4d’ tes.txt 删除1-4行

        ‘1d;4d’            删除1和4行



最常用

sed 's' test  替换 后面三斜杠原则

sed 's/root/hello/' test  没定位 全部匹配

sed 's/root/hello/g' test  没定位 全部匹配  g 把一行中的全部修改

sed -r 扩展 用到小括号

对/etc/passwd文件进行处理,将第一个字母删除

1
sed -r 's/^[a-Z]+[^a-Z]+//g' b.txt

这种情况是将第一部分和第二部分用空格替换
解决办法是通过括号和括号的位置进行替换

1
sed -r 's/(^[a-Z]+)([^a-Z]+)/\1\2/g' b.txt 此时是保持不变
1
sed -r 's/(^[a-Z]+)([^a-Z]+)/\2/g' b.txt 保留第二部分冒号
1
sed -r 's/(^[a-Z]+)([^a-Z]+)/\2\1/g' b.txt 第一和第二部分替换

将最后一个单词删除

1
sed -r 's/([^a-Z]+)([a-Z]+)$/\1/g' b.txt

将第一个和第二个单词替换

1
sed -r 's/(^[a-Z]+)([^a-Z]+)([a-z]+)([^a-z]+)/\3\2\1\4/g' b.txt

作业二:grep作业(正则表达式及字符处理)

目标文件/etc/passwd,使用grep命令或egrep

1.显示出所有含有root的行:

2.输出任何包含bash的所有行,还要输出紧接着这行的上下各两行的内容:

3.  显示出有多少行含有nologin。

4.显示出那些行含有root,并将行号一块输出。

5.显示出文件中

6.新建用户
    abominable
    abominate
    anomie
    atomize
    编写正则表达式,将他们匹配出来

7.建四个用户
    Alex213sb
    Wpq2222b
    yH438PIG
    egon666
    egon

    过滤出用户名组成是字母+数字+字母的行

8.显示出/etc目录下所有包含root的文件名

9. 过滤掉/etc/ssh/sshd_config内所有注释和所有空行

作业三:Sed作业:以/etc/passwd文件为模板

1,删除文件每行的第一个字符。

2,删除文件每行的第二个字符。

3,删除文件每行的最后一个字符。

4,删除文件每行的倒数第二个字符。

5,删除文件每行的第二个单词。

6,删除文件每行的倒数第二个单词。

7,删除文件每行的最后一个单词。

8,交换每行的第一个字符和第二个字符。

9,交换每行的第一个字符和第二个单词。

10,交换每行的第一个单词和最后一个单词。

11,删除一个文件中所有的数字。

12,删除每行开头的所有空格。

13,用制表符替换文件中出现的所有空格。

14,把所有大写字母用括号()括起来。
sed -r ‘s/[A-Z]/(&)/g’ /etc/passwd
15,打印每行3次。

16,只显示每行的第一个单词。

17,打印每行的第一个单词和第三个单词。

18,用命令获取格式为 mm/yy/dd 的日期格式,结合管道,将其换成 mm;yy;dd格式

© 2018 Peter's Blog Center All Rights Reserved.
Theme by hiero