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编程之正则表达式与文本处理器的主要内容,如果未能解决你的问题,请参考以下文章