文本处理三剑客
- 1、grep
- 字符匹配
- 2、sed
- sed字符替换
- 3、awk
1、grep
grep (global search regular expression_r(RE) and print out the line,全面搜索正则表达式并把行打印出来),用于查找文件里符合条件的字符串,支持基本正则表达式。
grep不支持拓展正则表达式,若使用正则表达式,则使用egrep,在使用上egrep=grep -E
实验素材:
使用方法:
grep 参数 过滤条件 文件
过滤包含有root的行:
grep root passwd
忽略大小写过滤包含root的行:
grep -i root passwd
过滤以root开头的行:
grep ^root passwd
过滤以root结尾的行:
grep root$ passwd
过滤空行
grep ^$ passwd
反向过滤:将所选条件以外的内容输出
输出除空行以外的内容:
grep -v ^$ passwd
过滤root且root前无字符的行
grep "\<root" passwd
过滤root且root后无字符的行
grep "root\>" passwd
过滤root且root前后无字符的行
grep "\<root\>" passwd
过滤root且root前后无字符的行且输出行号:
grep -n "\<root\>" passwd
只显示匹配行的行数:
grep -c "\<root\>" passwd
显示过滤行及上下n行:grep -n passwd
过滤adm并显示上下两行:
grep -2 adm passwd
显示过滤行及上面的两行:
grep -B2 adm passwd
显示过滤行及下面的两行:
grep -A2 adm passwd
字符匹配
.代表任意字符,一个.代表一个字符
查找文档中开头是r,结尾是t,中间有5个任意字符的匹配行:
…t匹配t前两个任意字符的行:
匹配以r开头,中间e的个数0到任意个,以d结尾的字符的行:
匹配以r开头,中间e的个数1到任意个,以d结尾的字符的行:
匹配以r开头,中间e的个数0到1个,以d结尾的字符的行:
{n},显示以r开头,e出现n次,以d结尾的字符的行:
{,n}匹配以r开头,中间e的个数最少多个,以d结尾的字符的行:
{n,}匹配以r开头,中间e的个数最少n个,以d结尾的字符的行:
{m,n}匹配以r开头,中间e的个数在m-n区间个,以d结尾的字符的行:
(字符){次数}指定字符出现的次数:
匹配haha出现5次的行:
脚本练习:
写一个脚本,脚本可以显示能够被su命令切换的用户
2、sed
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。
使用方法:
sed 参数 命令 处理对象
sed 参数 处理对象 -f 处理规则文件
常用参数:
参数 | 作用 |
-n | 不显示模式空间内容 |
-e | 可以在命令行执行多条内容 |
-f | 指定处理文件 |
-i | 直接修改原文件 |
动作:
p | 列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行 |
d | 删除 |
a | 添加(当前行的下一行) |
c | 替换 |
i|插入(当前行的上一行)
p:打印:
打印passwd文件第5行,使用-n参数不显示模式空间内容:
sed -n 5p passwd
打印passwd文件第五行,显示模式空间内容
sed 5p passwd
打印passwd文件的3到5行,不显示模式空间内容:
sed -n 3,5p passwd
打印passwd文件的第3行和第5行:
sed -ne "3p;5p" passwd
显示3行以后的行:
sed -ne '3,$p' passwd
显示以#开头的行:
sed -n '/^#/p' httpd.conf
删除第3行:
sed 2d passwd
删除以#开头的行:
sed '/^#/d' httpd.conf
删除以#开头以外的行:
sed '/^#/!d' httpd.conf
删除第3行到最后一行:
sed -e '3,$d' passwd
在第2行后添加hello:
sed -e '2a hello' passwd
在第2行后换行添加hello world:
sed -e '2a hello\nworld' passwd
在以#开头的行后添加hello:
sed -e '/^#/a hello' httpd.conf
将第3行换为hello:
sed 3chello passwd
将以#开头的行都换为@:
sed -e '/^#/c@' httpd.conf
在第二行插入hello:
sed 2ihello passwd
将以#开头的行写入file文件中:
sed '/^#/w file' httpd.conf
sed字符替换
替换文档中的第一列:为@ :
sed 's/:/@/' passwd
替换文档中的全文的:为@ :
sed 's/:/@/g' passwd
替换文档中的1到5行的:为@ :
sed '1,5s/:/@/g' passwd
替换文档中的2行的:为@ :
sed '2s/:/@/g' passwd
将文档的第三行中的所有:替换成@,将第六行的所有:替换为* :
sed '3s/:/@/g;6s/:/*/g' passwd
替换文档中字符adm到halt之间的:为@@:
sed '/adm/,/halt/s/:/@@@/g' passwd
替换文档中的/为##:
/为特殊符号,须转译:
sed 's/\//##/g' passwd
或者:
sed 's@/@##@g' passwd
sed 参数 处理对象 -f 处理规则文件:
3、awk