目录
Toggle三剑客之sed
正则补充perl语言
只有grep支持perl语言正则
. 匹配除换行符外的任意字符。
\d 表示数字 [0-9]
\w 表示数字,下划线,大小写字母 [0-9a-zA-Z]
\s 匹配的空字符,空格tab回车等 [\ \t\r\n\f] \n表示回车 \t表示tab键 tab一般是8个空格
\D 表示排除数字 [^0-9]
\S 非空字符
\W 排除数字,字母,下划线
零碎的正则-括号表达式-了解
‘[a-zA-Z0-9]’='[[:alnum:]]’ 几乎不用
[[:alpha:]]
:匹配任意一个字母(包括大写和小写)。[[:digit:]]
:匹配任意一个数字(相当于[0-9]
)。[[:lower:]]
:匹配任意一个小写字母。[[:upper:]]
:匹配任意一个大写字母。[[:space:]]
:匹配任意一个空白字符(包括空格、制表符等)。
sed命令

核心功能:取行,过滤,替换修改文件内容
难点:向后引用(截取)
sed stream editor 流编辑器 通过sed命令处理一行行的数据
命令 选项 详细格式 参数
sed ‘条件动作'(找谁干啥) 文件
条件;匹配哪一行,哪些行
动作:增删改查
sed -n ‘3p’ /etc/passwd #显示第三行内容
p表示显示/查找(输出) 如果不加n会默认输出,读一行显示一行(显示文件全部内容),第三行显示2遍
选项 说明
-n 取消默认输出
-r sed支持拓展正则
-i 修改文件内容 这个选项要放在一行命令的最后,-ir表示修改内容之前生成以r结尾的备份文件
-i.bak 先进行备份,然后修改文件内容
sed增删改查之查找
一种是类似于grep的模糊查找,//,模糊表示范围(用于日志)
一种是精确查找行号,//表示条件(找谁),除了给p(查找)用,还可以给改,增加,删除
执行多个命令时可以用;间隔表示前面命令结束sed -n '3p;5p' /etc/passwd
显示第3行和第5行sed -n '2,9p' /etc/passwd
显示第2-9行
sed的过滤功能需要用 ‘//p’ / /p中间支持正则,加r支持扩展正则sed -n '/^root/p' /etc/passwd
过滤root开头的行,不加^表示含有root的行
#sed过滤没有颜色
sed命令特色:获取范围内的日志 尤其时间范围要精确sed -n '// , //p' sed.txt
sed -n '/10:00:00/ , /11:00:00/p' sed.txt
查看10:00:00到11:00:00之间的日志内容#具体格式要看日志文件中时间的写法
sed增删改查之修改(替换)
不修改文件内容,只修改输出
格式说明:sed ‘s###g’ sed.txt (s@@@g,,s///g都可以)
防止替换的内容有#,可以换成其他字符如@/等等,但可以用###同时用\转义字符
前两个#之间可以用正则
s:substitute 替换 g:global 全局替换,这一行中把所有匹配到的内容进行替换,否则只替换掉每一行第一个匹配到的内容
sed -i 修改文件内容
把文件里的lidao修改成oldboy(修改文件内容),不加-i表示只修改输出
sed -i ‘s#lidao#oldboy#g’ sed.txt
sed -i.bak ‘s#lidao#oldboy#g’ sed.txt 表示修改前进行备份成sed.txt.bak,一般用于替换某一个文件,多个文件用打包压缩进行备份
替换进阶
1.后向引用格式
说明:后向引用或反向引用,适用于sed命令处理/提取一行中的某个部分,sed命令配合正则实现取列(类似于awk取列),是sed命令中用于处理列的方式
使用格式:使用替换的格式 s###g
前两个#之间通过正则与(),对数据进行分组
后面两个#之间通过\数字调用第n组的数据
整体是后面调用前面分组的内容,称为后向引用,反向引用
应用场景:某一行中对部分数据进行加工和处理,提取某一部分数据。
案例:输出1<234567>8(对于12345678这一行进行处理)
echo ‘12345678’ | sed -r ‘s#(1)(.*)(8)#\1#g’ #加上-r 即可使用()
1.调换/etc/passwd 第一列和最后一列内容
sed -r ‘s#^(.*)(:x.*:)(.*)$#\3\2\1#g’ /etc/passwd
sed -r ‘s#^([a-zA-Z0-9_-]+)(:.*:)(.*)$#\3\2\1#g’ /etc/passwd
2.取出网卡ip地址 ip address show eth0 取出第五行里的ip地址
ip a s eth0 | sed -n ‘5p’ | sed -r ‘s#^(.*)(inet )(.*)(/.*)$#\3#g’
如果用不上一整行的信息,不用吧整行内容全部分组,用什么把什么分出来
ip a s eth0 | sed -n ‘5p’ | sed -r ‘s#^.*inet (.*)/.*$#\1#g’
合并:ip a s eth0 | sed-nr ‘3 s###g p’ 表示对第三行进行sg替换
取出stat /etc/hosts 中的0644或644
stat /etc/hosts | sed -n ‘4p’ | sed -r ‘s#^[a-zA-Z: ]+\(([0-9]+)/.*$#\1#g’
sed -r ‘s#^.*\(([0-9]+)/.*$#\1#g’
0644
sed增删改查之删除
d delete sed命令删除功能按照行为单位进行
如果仅仅删除某一行的一些字符推荐使用替换(修改) ‘s#[a-z]##g’
格式: sed ‘3d’ sed.txt 不用加-n, 不加-i只修改输出,不改变文件内容
sed ‘1,3d’ 删除1-3行 sed ‘1d,3d’ 删除1和3行 sed ‘/ /d’ 删除//条件中的行,//中写正则
sed增删改查之增加
cai三个指令
a append 在指定行下面追加内容 sed ‘3a 内容’ 指定文件
sed ‘/oldboy/a 内容’ sed.txt 在包含/oldboy/的下一行加入内容
i insert 在指定行上面插入一行 sed ‘3i 内容’ 指定文件
c replace 替换指定行的内容 sed ‘3c 内容’ 指定文件