sed增删改查 (day 23)

正则补充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 内容’ 指定文件

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部