shell编程之正则表达式与文本处理器

Posted 世界美好與你環環相扣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell编程之正则表达式与文本处理器相关的知识,希望对你有一定的参考价值。

正则表达式定义

●正则表达式,又称正规表达式、常规表达式
●使用字符串来描述、匹配一系列符合某个规则的字符串
●正则表达式组成

普通字符

大小写字母、数字、标点符号及一些其他符号

元字符

在正则表达式中具有特殊意义的专用字符

正则表达式的分类

(1)基础正则表达式
(2)扩展正则表达式

Linux中文本处理工具

(1)grep
(2)egrep
(3)sed
(4)awk

基础正则表达式元字符

基础正则表达式是常用的正则表达式部分

常见的元字符

在这里插入图片描述

echo ABC/0 | grep [^a-zA-Z0-9]  匹配特殊字符
echo ABC/0 | grep ^[a-zA-Z0-9]  匹配以什么开头
cho goood | grep "go\\{1,3\\}d"   匹配o出现一到三次
echo good | grep "\\<g"          匹配以g开头的
echo good | grep "d\\>"          匹配以d结尾的
echo od | grep "\\<od\\>"         精确匹配
echo od | grep "\\<od\\>"         只匹配od
echo godgocdgoad | egrep "go{1}" o出现1次

扩展正则表达式元字符

扩展正则表达式是对基础正则表达式的扩充深化

扩展元空符

在这里插入图片描述

grep的常用命令

echo good | grep -E "go+d"
echo good | egrep  "go+d"
cho abcd  | egrep "g?d"
echo good   | egrep "g?d"  // g有没有无所谓,d一定要有
echo xxxgoodxxx   | egrep "(good)"
echo xxxgoodxxx   | egrep "(good)+"
echo xxxgoodxxxgood   | egrep "(good)*"
echo xxx  | egrep "(good)*"   //*代表0或者多次,没有good也能匹配
echo abc | egrep "a|b"
echo goodfoodcool | egrep "g(oo|ol)d"
echo gocdgoad | egrep "g(oc|oa)d"
egrep  "[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}" /etc/sysconfig/network-scripts/ifcfg-ens33 ipaddr.tst 

sed工具概述

sed工具又叫sed 流编辑器
■文本处理工具,读取文本内容,根据指定的条件进行处理,如删除、替换、添加等
■可在无交互的情况下实现相当复杂的文本处理操作
■被广泛应用于Shell脚本,以完成自动化处理任务■sed依赖于正则表达式
■工作原理
(1)读取
(2)执行:sed模式空间,相当于缓存
(3)显示
:1、读取第一行内容到缓存等待处理
①有处理动作就进行处理再输出
②没有处理动作就直接输出
2、输出到屏幕
再往下读取文件内容如此反复直到文件内容读完

sed命令格式:

sed -e “编辑指令” 文件1 文件2…
sed -n -e “编辑指令” 文件1 文件2…
sed -i -e “编辑指令” 文件1 文件2…

常用选项

●-e 指定要执行的命令,只有一个编辑命令时可省略
●-n 只输出处理后的行,读入时不显示
●-i 直接编辑文件,而不输出结果
●-f 用指定的脚本文件来处理输入的文本文件
●-I 差找是忽略大小写

sed常用命令


sed -n '/ROOT/IP' aa.txt              忽略大小写打印
sed ' ' aa.txt                        输出文件到屏幕   //sed ""txt 
sed 'p ' aa.txt                       逐行打印   //会有两遍
sed -n  'p ' aa.txt                   读入时不显示,只打印
sed -n  '1p' aa.txt                   打印第一行
ed -n  '3p' aa.txt                    打印第三行
cat -n aa.txt | sed -n '1,3p'
cat -n aa.txt | sed -n '$p'           打印最后一行
cat -n aa.txt | sed -n '1,+4p'        从第一行开始 打印四行
cat -n aa.txt | sed -n '1~2p'         打印基数行,从这行开始+2行打印
cat -n aa.txt | sed -n '2~2p'         打印偶数行
sed -n '2p;3P;5p' aa.txt              打印2,3,5行
cat -n aa.txt | sed -n '/root/p'      匹配含有root的行
sed -n '/^root/p' aa.txt              打印以root开头的行
sed -n '/bash$/p' aa.txt              打印以bash结尾的行
sed -n '/^root\\|nologin$/p' aa.txt    |是扩展元字符,需要转义
sed -n -r '/^root|nologin$/p' aa.txt  不转义的时候用-r,有扩展元素的时候使用
sed -nr '/^root|nologin$/p' aa.txt 
sed -ne '/^root/p'  -e '/nologin$/p'  aa.txt  -e是或的关系
sed -n '/^$/p'  aa.txt                打印空行
sed -n '/  /p' aa.txt                  打印有空格的行
sed -n '/\\\\/p' aa.txt                打印有\\的行
sed -n '/\\/bin\\/bash/p' aa.txt       打印/bin/bash的行
sed -n 's/\\/bin\\/bash/ccc/p' aa.txt  查找/bin/bash并替换
sed -n 's#/bin/bash#aaa#p' aa.txt    查找/bin/bash并替换
sed -n 's@/bin/bash@bbb@p' aa.txt    查找/bin/bash并替换
sed -n 's,/bin/bash,bbb,p' aa.txt    查找/bin/bash并替换
sed -n 's#/bin\\/bash#/bin/nologin#p' aa.txt
sed -n 's/ROOT/XXX/pi' aa.txt        替换的时候忽略大小写,默认第一个
sed -n 's/ROOT/XXX/gpi' aa.txt       全部替换并忽略大小写
sed -n 's/[0-9]/x/gp' aa.txt         把数字全部替换成x
sed '/root/cxxxx'  aa.txt            //c为整行替换,c后面的东西都是要替换的东西
sed ' = ' aa.txt                     打印行号
sed -n  ' = ' aa.txt                 不输出打印,只显示行号
sed -n  '$ = ' aa.txt                打印最后一行的行号
sed -n  '$ =;3p ' aa.txt             打印第三行内容,并显示最后一行行号  //sed是逐行打印的,所有3p在前
sed  '5q' aa.txt                     从第5行退出,后面不做处理
6

删除

cat -n aa.txt  | sed -n 'd'         全部删除
sed -n '10d'   aa.txt               删除第10行
sed  '1,3d' aa.txt                  删除第1到3行
sed '/root/d'                       删除包含root的行
sed '/^root/d' aa.txt               删除已root开头的行
sed -n '10s/ROOT/XXX/gpi'           定位到第10行忽略大小写把root替换成XXX
sed -n '1,10s/ROOT/XXX/gpi'         第1行和第10行 

文件#开头注释的增减和删除

sed -n '1,2s/^/#/p' aa.txt                1,2行开头添加#注释 
sed -n '10s/^#//p' aa.txt                 去掉第10行的#注释
sed -n 's/^ /#/p'  aa.txt                 把空格换成#
sed -n 's/^bin/#&/p' aa.txt                以bin开头的行替换成#  //&为替代符号,替代前面的bin 

内容插入

sed '1a hello word'  aa.txt               在第一行的下面插入hello word
sed '1i hello word'  aa.txt               在第一行上面插入
sed 'a IPADDR=192.168.80.1' aa.txt        每一行的下面都插
sed '/root/a IPADDR=192.168.80.1' aa.txt  有root的的行插入
sed '1,3a IPADDR=192.168.80.1' aa.txt     1—3行插入

编辑文件

sed -i '1,3a  IPADDR=192.168.1.1' aa.txt 直接编辑文件,而不输出结果
sed -i.bak '1,3a  IPADDR=192.168.1.1'  aa.txt 编辑文件的时候备份文件
sed  'r /etc/hosts' aa.txt               r读取一个文件
sed '1r /etc/hosts' aa.txt               第1行读过来
sed '1,3r /etc/hosts' aa.txt             1到3行
sed '/root/r /etc/hosts'  aa.txt         在有root的行读取
sed 'w /opt/bak'  aa.txt                 写入另外一个文件/另存
sed '1w /opt/bak'  aa.txt                再次写入就覆盖

以上是关于shell编程之正则表达式与文本处理器的主要内容,如果未能解决你的问题,请参考以下文章

Shell编程之正则表达式

shell脚本之正则表达式

05 shell编程之正则表达式

shell编程之正则表达式sed工具

shell脚本编程之正则表达式(扩展正则表达式sed)

shell编程-正则表达式与文本处理器sedawk