Linux(8):linux三剑客sed & awk

linux 三剑客 之 sed

# sed 是什么?
# sed : 字符流编辑器 Stream Editor; sed 擅长 替换、取行等

# sed 的功能与版本:
    处理纯文本文件、日志、配置文件等 
    增加、删除、修改、查询
    sed --version  # 查看 sed 版本
    
# sed 语法格式:
    sed [选项] [sed指令] [输入文件]
    sed -i.bak 's#oldboy#oldgirl#g' oldboy.txt        # -i --- sed命令的参数 ;sed --- sed命令,一个指令 ;g    --- 小尾巴, 修饰

sed 命令的执行流程

模式空间: sed 从文件读取一行文件后存入的缓冲区 (这个缓冲区是在内存中的)

sed 常用功能:

1. 查询
2. 增加
3. 删除
4. 替换
5. 拓展

1. sed 常用功能之显示 p (print)

# 创建测试环境:
cat>person.txt<<EOF
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
EOF

# cat>...<<EOF...EOF  表示创建文件 ; cat>>...<<EOF...EOF 表示向文件中追加内容

[root@NEO oldboy]# cat person.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@NEO oldboy]# 

# 1.1 显示某一行    
[root@NEO oldboy]# sed -n '3p' person.txt     # -n 表示 取消默认输出; '3p' 表示显示第3行
103,Alex,COO
    
# 1.2 显示连续多行文本
# 显示第2行到第4行的内容,包含第2行和第4行
[root@NEO oldboy]#  sed -n '2,4p' person.txt     # '2,4p' 表示显示从第2行到第4行
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO

# 1.3 显示包含 oldboy 的行到 包含104的行
[root@NEO oldboy]# sed -n '/oldboy/p' person.txt     # '/oldboy/p' ---> 表示 包含 oldboy 的行 ;此时 该行命令 相当于 grep 'oldboy',但 grep 不能过滤范围
101,oldboy,CEO
[root@NEO oldboy]# sed -n '/oldboy/,/104/p' person.txt         # '/oldboy/,/104/p' ---> 包含 oldboy 的行 到 包含 104 的行
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
[root@NEO oldboy]# sed -n '/oldboy/,/^104/p' person.txt     # '/oldboy/,/^104/p' ---> 表示从包含 oldboy 的行到 以104开头的行
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO


# 1.4 过滤多个字符串
# 默认情况下,sed只支持基本正则表达式;sed 的 -r 参数,可以支持 扩展正则表达式 (| 和 ())
# 显示包含 oldboy 的行 或者 yy 的行
[root@NEO oldboy]# egrep 'oldboy|yy' person.txt 
101,oldboy,CEO
104,yy,CFO
[root@NEO oldboy]# sed -rn '/oldboy|yy/p' person.txt     # -r '/oldboy|yy/p' ---> 表示 包含 oldboy 或者 yy 的行
101,oldboy,CEO
104,yy,CFO

# sed 命令通过正则表达式进行过滤时,相当于 egrep 


# 1.5 查询指定多行
[root@NEO oldboy]# sed -n '1p;3p' person.txt     #  '1p;3p' ---> 第1行 和 第3行; 多行之间用 逗号 分隔
101,oldboy,CEO
103,Alex,COO
[root@NEO oldboy]# sed -n '1p;2,4p;5p' person.txt     # , 和 ; 搭配使用
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@NEO oldboy]# sed -n '/oldboy/p;3,5p' person.txt 
101,oldboy,CEO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

2. sed 常用功能之增加

# 2.1 单行增加:
# 在第3行后面增加一行内容
[root@NEO oldboy]# cat person.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@NEO oldboy]# sed '3a 103.5,Lee,UFO' person.txt     # 3a 表示在第3行的后面增加一行内容,3a 后面的空格没有用,也可以不写
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
103.5,Lee,UFO
104,yy,CFO
105,feixue,CIO[root@NEO oldboy]# cat person.txt     # sed '3a ' 命令并没有真正修改文件内容,如果想要真正修改文件内容,可以用 sed 的 -i 参数
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@NEO oldboy]# sed '3i 103.5,Lee,UFO' person.txt     # 3i 表示在第3行的前面再增加一行内容;同理, 该命令也没有真正修改文件内容,想要真正修改文件内容也是加上 -i 参数
101,oldboy,CEO
102,zhangyao,CTO
103.5,Lee,UFO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

# 增加单选文本:
    a 参数 :追加 append,在指定行后添加一行或多行文本
    i 参数 :插入 insert,在指定行前添加一行或多行文本

# 在最后一行插入:
[root@NEO oldboy]# sed -n '$p' person.txt     # 在 sed 命令中, $ 表示最后一行
105,feixue,CIO
[root@NEO oldboy]# sed  '$a 103.5,Lee,UFO' person.txt     # 在最后一行插入一行内容
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
103.5,Lee,UFO
[root@NEO oldboy]# sed  '$a new,new,new\nold,old,old' person.txt     # 在最后一行增加多行内容,用 \n 分隔 (这种方法不常用;此命令已被 cat>>...<<EOF...EOF 替代,而且在最后一行的多行追加一般用 cat>> 方法)
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
new,new,new
old,old,old

3. sed 常用功能之删除

# 去除空行实战:删除最后一行
[root@NEO oldboy]# cat person.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@NEO oldboy]# sed '$d' person.txt     # 删除最后一行
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
[root@NEO oldboy]# sed '1,3d' person.txt  # 删除第1行到第3行; d 表示 delete 
104,yy,CFO
105,feixue,CIO
    
# 企业案例:不显示文件中空行
[root@NEO oldboy]# vim person.txt 
[root@NEO oldboy]# cat -nA person.txt     # cat 的 -n 参数表示显示 行号, -A 表示 显示结尾的 $
     1    101,oldboy,CEO$
     2    102,zhangyao,CTO$
     3    $
     4    103,Alex,COO$
     5    $
     6    104,yy,CFO$
     7    $
     8    105,feixue,CIO$
[root@NEO oldboy]# grep -v '^$' person.txt     # grep -v 表示 排除
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@NEO oldboy]# sed '/^$/d' person.txt     # sed 的 /^$/ 表示空行
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
    
# 另一种方法: sed 的 ! 表示 取反; 在 p d 这些参数前面加 !
[root@NEO oldboy]# sed -n '/^$/p' person.txt     # 显示空行



[root@NEO oldboy]# sed -n '/^$/!p' person.txt     # 排除空行
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@NEO oldboy]# 
[root@NEO oldboy]# sed '$!d' person.txt     # '$!d' : 不删除最后一行
105,feixue,CIO

猜你喜欢

转载自www.cnblogs.com/neozheng/p/10687272.html
今日推荐