13.Linux四剑客之sed文本处理工具

2021-07-01 分类:Linux基础, shell编程 阅读(517) 评论(0)

孙富阳, 江湖人称没人称。多年互联网运维工作经验,曾负责过孙布斯大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型博客网站运维工作。

1.sed基本概述

1.sed基本介绍
sed(Stream Editor),流编辑器。能够对标准输出或文件进行逐行处理。 简单来说,sed可以实现对文件的增、删、查、改。
2.sed工作模式
sed读取文件一行,存放在缓存区,然后处理,最后输出。
3.sed基础语法
第一种形式:stdout | sed [option] "pattern command"
第二种形式: sed [option] "pattern command" file

2.sed常用选项

选项含义
-n只打印匹配的行(取消文件的默认输出)
-e允许多项编辑
-f编辑动作保存在文件,指定文件才执行
-r支持扩展正则表达式
-i直接变更文件内容

2.1 sed相关选项示例
[root@sfy ~]# cat file.txt
I love shell
I love SHELL
This is test file
2.1.1 sed-n、-e选项示例
[root@sfy ~]# sed -n '/shell/p' file.txt
I love shell
[root@sfy ~]# sed -n -e '/shell/p' -e '/SHELL/p' file.txt
I love shell
I love SHELL
2.1.2.sed -f选项示例
[root@sfy ~]# cat edit.sed
/shell/p
/SHELL/p
[root@sfy ~]# sed -nf  edit.sed file.txt 
I love shell
I love SHELL
2.1.3sed -r 选项示例
[root@test /opt]# sed -n '/shell|SHELL/p' file.txt
[root@test /opt]# sed -rn '/shell|SHELL/p' file.txt
I love shell
I love SHELL

3.sed pattern (sed [option] '/pattern/command' file)

匹配模式含义
10command匹配第10行
10,20command匹配从第10行开始,到第20行结束
10,+5command匹配从第10行开始,到第16行结束
/pattern1/,/pattern2/command匹配到pattern1的行开始,到 匹配到pattrn2的行结束
10,/pattern1/command匹配从第10行开始,到匹配到pattern1的行结束
3.1sed相关pattern示例
3.1.1打印passwd文件的第10行
[root@test /opt]# sed -n  '10p' /etc/passwd 
3.1.2打印passwd文件的10到20行
[root@test /opt]# sed -n "10,20p" /etc/passwd 
3.1.3打印passwd文件中从第1行开始,往后面加5行的内容
[root@test /opt]# sed -n '1,+5p' /etc/passwd 
3.1.4打印passwd文件中以root开头的行
[root@test /opt]# sed -n '/^root/p' /etc/passwd 
3.1.5从匹配到pattern1的行,到匹配pattern2的行
#打印passwd文件第一个匹配到以bin开头的行,到第二个匹配到以ftp的行
[root@test /opt]# sed -n '/^bin/,/^ftp/p' /etc/passwd 
3.1.6从指定的行号开始匹配,直到匹配到pattern1的行
#打印passwd文件中从第2行开始匹配,直到以^halt开头的行结束
[root@test /opt]# sed -n '2,/^halt/p' /etc/passwd

4.sed追加命令

编辑命令含义
a行后追加内容
i行前追加内容
r读入外部文件,行后追加
w将匹配行写入外部文件
4.1匹配/bin/bash的行,在其行后面添加一行内容。
[root@test ~]# sed  -i  '/^bin/a OK' passwd
4.2以/bin开头的行到已sshd开头的行,前面添加一行。
[root@test ~]# sed '/^bin/,/^sshd/i AAA-AAA-OK' passwd
4.3指定给文件的30行添加一行内容。
[root@test ~]# sed -i  '30i listen 80;' passwd
4.4将list.txt文件中的内容,追加到匹配模式的行后面
[root@test ~]# sed -i  '/root/r list.txt' passwd
4.5匹配/bin/bash所有的行,将其保存至/tmp/login.txt文件中
[root@test ~]# sed '/\/bin\/bash/w /tmp/login.txt' passwd

5.sed删除命令

编辑命令含义
1d删除第1行的内容
1,5d删除1行到5行的内容
2,+5d删除2行以及往下的5行的内容
/pattern1/d删除每行中匹配到pattern1的行内容
/pattern1/,/pattern2/d删除匹配到pattern1的行直到匹配到pattern2的所有行内容
/pattern1/,10d删除匹配到pattern1的行到10行的所有行内容
10,/pattern1/d删除第10行直到匹配到pattern1的所有内容
5.1删除passwd文件中第1行内容
[root@test ~]# sed '1d' passwd
5.2删除passwd文件中第1行到第5行的内容
[root@test ~]# sed '1,d' passwd
5.3删除passwd文件中第2行以及往下的5行内容
[root@test ~]# sed '2,+5d' passwd
5.4匹配/sbin/nologin结尾的行,然后进行删除。
[root@test ~]# sed '/\/sbin\/nologin$/d' passwd
5.5匹配以sshd开头的行,到rpc开头的行
[root@test ~]# sed  '/^sshd/,/^rpc/d' passwd
5.6删除vsftpd配置文件以#号开头的行,以及空行
#删除配置文件中#号开头的注释行, 如果碰到tab或空格是无法删除 
[root@test ~]# sed '/^#/d' file
#删除配置文件中含有tab键的注释行
[root@test ~]# sed -r '/^[ \t]*#/d' file
#删除无内容空行
[root@test ~]# sed -r '/^[ \t]*$/d' file

6.sed修改命令

编辑命令 含义
1s/old/new/替换第1行内容old为new
1,10s/old/new/替换1行到10行的内容old为new
1,+5s/old/new/替换1行到6行的内容old为new
/pattern1/s/old/new/替换匹配pattern1的内容old为new
/pattern1/,/pattern2/s/old/new/替换匹配到pattern1的行直到匹配到pattern2的所有行内容old为new
10,/pattern1/s/old/new/替换第10行直到匹配到pattern1的所有行内容old为new
6.1修改passwd文件第1行中第一个root为ROOT
[root@test ~]# sed -i  '1s/root/ROOT/' passwd
6.2修改passwd文件中第5行到第10行中所有的/sbin/nologin为/bin/bash
[root@test ~]# sed -i '5,10s/\/sbin\/nologin/\/bin\/bash/' passwd
[root@test ~]# sed -i '5,10s#/sbin/nologin#/bin/bash#' passwd
6.3修改passwd文件中匹配到/sbin/nologin的行,将匹配到行中的login为该大写的LOGIN
[root@test ~]# sed -i '/\/sbin\/nologin/s#login#LOGIN#g' passwd
[root@test ~]# sed -i '/\/sbin\/nologin/s/login/LOGIN#g' passwd
6.4修改passwd文件中从匹配到以root开头的行,到匹配到行中包含bin的所有行。
[root@test ~]# sed -i '/^root/,/^bin/s/bin/BIN/g' passwd
6.5修改SELINUX=enforcing修改为SELINUX=disabled。(可以使用c替换方式)
[root@test ~]# sed -i '/^SELINUX=/c SELINUX=disabled' selinux
6.6将nginx.conf配置文件添加注释。
[root@test ~]# sed -i 's/^/# /' nginx.conf
6.7使用sed提取eth0网卡的IP地址
[root@test ~]# ifconfig eth0 | sed -rn '2s/^.*et //p' | sed -rn 's/ ne.*//p' 
[root@test ~]# ifconfig eth0 |sed -nr '2s/(^.*et) (.*) (net.*)/\2/p'

7.sed忽略大小写

[root@test /opt]# cat file.txt 
I love shell
I love SHELL
This is test file
[root@test /opt]# sed -n '/shell/Ip' file.txt
I love shell
I love SHELL

8.sed打印偶数行或者奇数行

[root@test ~]# seq 10 |sed -n '1~2p'
1
3
5
7
9
[root@test ~]# seq 10 |sed -n '2~2p'
2
4
6
8
10

评论已关闭

登录

忘记密码 ?

切换登录

注册

鲁ICP备2021019243号-1