什么是正则表达式
正则表达式是一种描述一组字符串的模式,为处理大量文本、字符串而定义的一套规则和方法,以行为单位进行处理。正则表达式分为两类:基本正则表达式(BRE)和扩展正则表达式(ERE)。在linux中使用正则表达式较多的有三个工具,分别为grep,sed和awk,这三个工具被称为linux文本处理的三剑客。
- grep 文本过滤命令
- sed 行编辑器
- awk 报告生成器
grep文本搜索工具
grep(Global search regular expression and print out the line)
全面搜索研究正则表达式并显示出来 grep 命令是一种强大的文本搜索工具 , 根据用户指定的“模
式”对目标文本进行匹配检查,默认输出匹配行
由正则表达式或者字符及基本文本字符所编写的过滤条件 egrep和fgrep的命令只跟grep有很小不同。egrep和fgrep都是grep的扩展,支持更多的元字符,fgrep就是fixedgrep或fast
grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。
扩展使用egrep=grep -E 支持更多的元字符
位置确定
^关键字:行首锚定
关键字$:行尾锚定
^$:匹配空白行
\<关键字:词首锚定
关键字 \>: 词尾锚定
grep 的格式
grep 匹配条件 处理的文件
例如
grep root passwd 过滤出含有root的行
grep ^root passwd 过滤出root的首行
grep root$ passwd 过滤出root结尾的行
grep -E "root|ROOT" passwd 过滤出含有root/ROOT的行
grep -Ei root passwd 不区分大小写 过滤出含有root的行
grep ROOT passwd -n2 ##过滤出含有ROOT的行及其上下各2行且标明行号
grep ROOT passwd -1 ##过滤出含有ROOT的行及其上下各一行
grep ROOT passwd -A1 ##过滤出含有ROOT的行及其下一行
grep ROOT passwd -1 ##过滤出含有ROOT的行及其上一行
grep -i root passwd -v(反向过滤)
cat -b passwd 查看文件并且显示列数
grep 中字符的匹配次数设定
grep xy westos
grep x.y westos ##点匹配到任意字符
grep x..y westos
grep x...y westos
x*y ##y字符前x字符出现 [0- 任意次 ] 高亮显示满足条件的xy
x?y ##x字符出现 [0-1 次 ]
x+y ##x字符出现 [1- 任意次 ]
x{n}y ##x字符出现 [n 次 ]
x{m,n}y ##x字符出现 [ 最少出现 m 次,最多出现 n 次 ]
x{0,n}y ##x字符出现 [0-n 次 ]
x{m,}y ##x字符出现 [ 至少 m 次 ]
(xy){n}xy ##xy关键字出现 [n 次 ]
x.*y ##关键字之间匹配任意字符
屏蔽贪婪模式
grep -E "\<x{1}y" westos
grep -E "x{1}y\>" westos
grep -E "\<x{1}y\>" westos
sed 行编辑器
stream editor 用来操作纯 ASCII 码的文本处理时 , 把当前处理的行存储在临时缓冲区中 , 称为“模式空间”(pattern space) 可以指定仅仅处理哪些行, sed 符合模式条件的处理
不符合条件的不予处理,处理完成之后把缓冲区的内容送往屏幕 接着处理下一行 , 这样不断重复 , 直到文件末尾Sed 命令格式
调用 sed 命令有两种形式:
sed [options] 'command' file(s)
sed [options] -f scriptname file(s)
**sed 对字符的处理 **
p | 显示 |
d | 删除 |
a | 添加 |
c | 替换 |
w | 写入 |
i | 插入 |
p 模式操作 (加-n屏蔽掉模式空间)
sed -n ‘/UUID$/p’ fstab ##显示文件fstab中以UUID开头的行
sed -n ‘/^UUID/p’ fstab ##显示文件fstab中以UUID结尾的行
sed -n ‘2,6p’ fstab ##显示文件fstab的2到6行
sed -n ‘2,6!p’ fstab ##不显示文件fstab的2到6行
sed -n ‘2p’ fstab ##显示文件fstab的2行
sed -n ‘2p;6p’ fstab ##显示文件fstab的第2行和第6行
d 模式操作(不加-n不屏蔽掉模式空间)
sed '/^UUID/d' /etc/fstab ##去掉文件fstab中以UUID开头的行
sed '/^$/d'/etc/fstab ##去掉文件fstab中以UUID开头的行
sed '1,4d'/etc/fstab ##去掉文件fstab中的1-4行
sed '1d;4d'/etc/fstab ##去掉文件fstab中的第1行和第4行
sed '/^UUID/!d' /etc/fstab ##显示文件fstab中以UUID开头的行
a/i/c 模式操作
sed '/^UUID/a \hello /etc/fstab ##给文件fstab中以UUID开头的行后添加hello
sed '/^UUID/a \hello \nwestos /etc/fstab ##给文件fstab中以UUID开头的行后添加hello 换行后再添加westos
sed '/^UUID/i \hello \nwestos /etc/fstab ##给文件fstab中以UUID开头的行前添加hello 换行后再添加westos
sed ‘/^#/c \hello /etc/fstab’ ##给文件fstab中以#开头的行更改为hello
w 模式操作
sed '/^UUID/w haha' /etc/fstab ##将文件fstab中以UUID开头的行写入到文件haha中 不屏蔽缓存空间
sed -n'/^UUID/w /tmp/fstab.txt' /etc/fstab ##将文件fstab中以UUID开头的行写入到文件haha中 屏蔽缓存空间
sed '/^#/='/etc/fstab ##将文件fstab中以#开头的行前加入行号
sed '6r haha' /etc/fstab ##将文件haha里的内容写到文件fstab的第6行
sed 的其他用法
sed -n -e '/^UUID/p' -e '/^UUID/=' fstab ## -e相当与;
sed 's/brown/green/; s/dog/cat/' data ##分隔符的使用规则
sed -f rulesfile file ##对文件file执行脚本rulesfile
sed 's/#/@/' /etc/fstab ##文件中的#替换为@
sed '1,5s/#/@/' /etc/fstab ##文件1-5行中的#替换为@
sed 's/^\//#/'/etc/fstab ##将文件fstab中的所有/替换为# /之前要使用转义字符\
sed 's/\//#/g/'/etc/fstab ##s///g=s/// 可以省略g
sed 's@^/@#@g'/etc/fstab ##@与/分隔符功能相同
sed 'G' data ##文件每行前加空行
sed '$!G' data ##文件每行前加空行
sed '=' data | sed 'N; s/\n/ /'
编辑脚本
如何给文件标上行号
如何保存文件更改
-i 文件名
awk 报告生成器
awk 处理机制:awk
会逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行做一些总结性质的工作
在命令格式上分别体现如下
BEGIN{} | 读入第一行文本之前执行,一般用来初始化操作 |
‘{ xxxx }’ | 逐行处理,逐行读入文本执行相应的处理,是最常见的编辑指令快 |
END{} | 处理完最后一行文本之后执行,一般用来输出处理结果 |
-F | 指定分隔符 |
awk 基本用法
awk '{print FILENAME}' passwd
awk '{print 第"NR"行,有"NF"列}'
awk 'BEGIN{print NAME}' ##BEGIN执行命令之前执行的
awk 'END{print WESTOS}' ##END执行完所有命令之后执行的
awk -F : 'BEGIN{print NAME}{print $1}END{WESTOS}' ##-F指定分隔符
awk '/bash$/' passwd ##文件中以bash结尾的行
awk -F : '/bash$/{print $1}' ##打印文件中以bash结尾的行 以:为分隔符的第一列
awk -F : '/^[a-d]/{print $1,$6}' passwd.txt
awk -F : '/^a|nologin$/{print $1,$7}' passwd.txt
awk -F : '$6~/bin/{print }' ##打印出以:为分隔符的第6列是bin的行
小练习
统计出家目录是/home并且可以登陆的用户个数
尝试抓取自己的ip