一:sed基本命令

sed的使用格式

sed [optiona] ‘command’ files

sed 参数[-nefir] 动作[n1,[n2]] function
sed -n:只有经过sed特殊处理的那些行才会被列出来
-e:直接在命令行模式上进行sed的动作编辑
-f:直接将sed的动作写在文件里,-f filename则可以执行filename内的动作
-r:sed的动作支持的是扩展正则表达式,读取指定文件的内容
-i:直接修改读取到的文件的内容,而不是屏幕输出
n1,n2一般代表执行动作的行,也可以用正则表达式
function:
a:新增
c:替换
d:删除
i:插入行
p:打印
s:替换

1:以行为单位新增/删除功能

1:将/etc/passwd.bak的内容列出来并且打印行号,同时删除第2-5行
[root@localhost etc]# nl /etc/passwd.bak |sed '2,5d' #删除2到5行 [root@localhost etc]# nl /etc/passwd.bak |sed '2d' #删除第2行
[root@localhost etc]# nl /etc/passwd.bak |sed '2,$d' #删除2行到最后一行
1 root:x:0:0:root:/root:/bin/bash
[root@localhost tmp]# sed '/^$/d' passwd.bak #删除空行 2:在第二行后面,也就是第3行上,加上“I love batman!” [root@localhost etc]# nl /etc/passwd.bak | sed '2a I love batman! '
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
I love batman!
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
... 3:添加多行
nl /etc/passwd.bak | sed '2a I love batman! ... \ [敲一下回车]
> ssssss '
#以'结束多行内容
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
I love batman! ...
ssssss
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
... #模式匹配的方式
sed '/2004/a\China' xxxx.txt #希望在2004的下一行添加China
sed '/2004/i\China' xxxx.txt #希望在2004的前一行添加China
4:$:最后一行---在文档最后一行添加I love linux
[root@localhost tmp]# nl passwd.bak | sed '$a I love linx '

2:以行为单位替换/打印

1:将第2-5行的内容替换为“No 2-5 number”
[root@localhost etc]# nl /etc/passwd.bak | sed '2,5c no 2-5 number'
1 root:x:0:0:root:/root:/bin/bash
no 2-5 number
6 sync:x:5:0:sync:/sbin:/bin/sync
... 2:简单直接取出你想要的行数
[root@localhost etc]# nl /etc/passwd.bak | sed '2,5p' #2-5行会重复输出
[root@localhost etc]# nl /etc/passwd.bak | sed -n '2,5p' #加上-n,只输出2-5行
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin #模式匹配的方式
[root@localhost etc]# sed -n '/root/p' passwd.bak #把包含murex字符的行输出,别忘记加上-n参数
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

3:以行为单位进行部分数据的查找以及替换的功能------可以批量处理配置文件

-s替换:分隔符/,#等等 加g:全局替换

1:直接修改文件的内容
[root@localhost etc]# sed -in 's/n$/\!/g' passwd.bak #将每一行结尾的n替换为!,注意转义
[root@localhost tmp]# ifconfig eno16777728 | sed -n '/inet /p' | sed 's/inet//g' | sed 's/net.*$//' #取出IP地址

4:!取反,不打印某些行

1:不打印5到10行
[root@localhost tmp]# nl passwd.bak | sed -n '5,10!p'

5:定位间隔几行 first~step

1:间隔行输出,输出单行,第一行开始
[root@localhost tmp]# nl passwd.bak |sed -n '1~2p'
1 root:x:0:0:root:/root:/bin/bash
3 daemon:x:2:2:daemon:/sbin:/sbin/nologi!
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologi!
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdow!
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologi!
11 games:x:12:100:games:/usr/games:/sbin/nologi!
13 nobody:x:99:99:Nobody:/:/sbin/nologi!
15 polkitd:x:999:998:User for polkitd:/:/sbin/nologi!
17 avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologi!
19 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologi!

6:以行为单位插入数据

1;在1-5行,每行前插入 I love linux
[root@localhost tmp]# nl passwd.bak | sed '1,5i I love linux'
I love linux
1 root:x:0:0:root:/root:/bin/bash
I love linux
2 bin:x:1:1:bin:/bin:/sbin/nologi!
I love linux
3 daemon:x:2:2:daemon:/sbin:/sbin/nologi!
I love linux
4 adm:x:3:4:adm:/var/adm:/sbin/nologi!
I love linux
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologi!
2:使用\来转义空格,使其对其
[root@localhost tmp]# nl passwd.bak | sed '1,5i\ I love linux'
I love linux
1 root:x:0:0:root:/root:/bin/bash
I love linux
2 bin:x:1:1:bin:/bin:/sbin/nologi!
I love linux
3 daemon:x:2:2:daemon:/sbin:/sbin/nologi!
I love linux
4 adm:x:3:4:adm:/var/adm:/sbin/nologi!
I love linux
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologi!

二:高级操作命令

1:-{} :多个sed命令,用;分开

1:删除5-10行,再进行替换操作
[root@localhost tmp]# nl passwd.bak | sed '{5,10d;s/oracle/root/}'

2: -n:读取下一个输入行(用下一个命令处理)-----{}里面的n

1:操作偶数行-----调第一行的时候,读取出第二行:打印,以此类推
[root@localhost tmp]# nl passwd.bak | sed -n '{n;p}'
[root@localhost tmp]# nl passwd.bak | sed -n '2~2p' #第2行开始,间隔行为2
2 bin:x:1:1:bin:/bin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
8 halt:x:7:0:halt:/sbin:/sbin/halt
10 operator:x:11:0:operator:/root:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
14 dbus:x:81:81:System message bus:/:/sbin/nologin
16 avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
18 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
20 oracle:x:1000:1000:oracle:/home/oracle:/bin/bash
2:操作奇数行
[root@localhost tmp]# nl passwd.bak | sed -n '{p;n}'
[root@localhost tmp]# nl passwd.bak | sed -n '1~2p' #第1行开始,间隔行为2
1 root:x:0:0:root:/root:/bin/bash
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
15 polkitd:x:999:998:User for polkitd:/:/sbin/nologin
17 avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
19 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

3:-&:替换固定字符串----替换操作的优化

1:把passwd中的用户后面都添加上4个空格
[root@localhost tmp]# sed 's/^[a-z_-]\+/& /' passwd.bak
root :x:0:0:root:/root:/bin/bash
bin :x:1:1:bin:/bin:/sbin/nologin
daemon :x:2:2:daemon:/sbin:/sbin/nologin
adm :x:3:4:adm:/var/adm:/sbin/nologin
lp :x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync :x:5:0:sync:/sbin:/bin/sync
shutdown :x:6:0:shutdown:/sbin:/sbin/shutdown

4:元字符(\u,\l,\U,\L) :转换为大写,小写:\u,\l对首字母,\U,\L对一串字符

[root@localhost tmp]#  sed 's/^[a-z_-]\+/\u&/' passwd.bak   #首字母转换为大写
Root:x:0:0:root:/root:/bin/bash
Bin:x:1:1:bin:/bin:/sbin/nologin
Daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@localhost tmp]# sed 's/^[a-z_-]\+/\U&/' passwd.bak #匹配字符串全部转换为大写
[root@localhost tmp]# sed 's/^[a-z_-]\+/\l&/' passwd.bak #首字母转换为小写
[root@localhost tmp]# sed 's/^[a-z_-]\+/\L&/' passwd.bak #匹配字符串首字母转换为小写

5:-( ) : 替换某种(部分)字符串\1,\2

1:获取ip的另一种思路
[root@localhost tmp]# ifconfig eno16777728 |grep netmask| sed 's/\(inet\)\(.*\)\(net.*\)/\2/'
192.168.1.10
[root@localhost tmp]# ifconfig eno16777728 |sed -n '/inet /p'| sed 's/\(inet\)\(.*\)\(net.*\)/\2/' 192.168.1.10
[root@localhost tmp]# ifconfig eno16777728 |sed -n '/inet /p'| sed 's/inet \([0-9.]\+.*\) net.*/\1/ '
192.168.1.10
2:获取passwd种的USER,UID,GID
[root@localhost tmp]# sed 's/\(^[a-z_-]\+\):.*$/\1/' passwd.bak #第一步
[root@localhost tmp]# sed 's/\(^[a-z_-]\+\):x:\([0-9]\+\):.*$/\1:\2/' passwd.bak #第二步
[root@localhost tmp]# sed 's/\(^[a-z_-]\+\):x:\([0-9]\+\):\([0-9]\+\):.*$/\1:\2:\3/' passwd.bak
root:0:0
bin:1:1
daemon:2:2
adm:3:4
lp:4:7
sync:5:0
shutdown:6:0
halt:7:0
mail:8:12 #### \d判断的不只是0-9,而是一个 Unicode 字符集

6:-r复制指定文件插入到匹配行-----不改变文件内容

​ -w:复制匹配行拷贝到指定文件里

1:
[root@localhost tmp]# echo -e "123\n456\n789" > 123.txt
[root@localhost tmp]# cat 123.txt
123
456
789
[root@localhost tmp]# echo -e "abc\ndef\nxyz" > abc.txt
[root@localhost tmp]# cat abc.txt
abc
def
xyz
[root@localhost tmp]# sed '1r 123.txt' abc.txt ### 读123.txt这个文件,并插入到abc.txt的第1行中
abc
123
456
789
def
xyz 2:-w:改写内容,把123.txt的第一行写入到abc.txt中
[root@localhost tmp]# sed '1w abc.txt' 123.txt
123
456
789
[root@localhost tmp]# cat abc.txt #abc的原内容会被覆盖
123

7:-q退出

1:到第5行就退出sed
[root@localhost tmp]# nl passwd.bak | sed '5q'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

8:识别空格和制表符(tab)

[root@localhost tmp]# cat tab_space.txt
this is tab finish.
this is several space finish.
[root@localhost tmp]# sed -n l tab_space.txt ### -n l是L的小写字母
this is\ttab\tfinish.$
this is several space finish.$

sed---流文本操作的更多相关文章

  1. 【Linux】linux中文本操作利器grep,awk,sed

    grep命令 grep(global search regular expression)是一种强大的文本搜索工具,它可以使用正则表达式搜索文本,并把匹配的行打印出来.平时搜索文本中内容的时候是非常方 ...

  2. Linux Bash文本操作之sed篇其二

    上一篇总结了sed的基础应用(Linux Bash文本操作之sed篇其一),内容实在有够多,这里再对稍微高级一些的用法做一个整理,以方便使用时查阅. 查看文本内容 示例1表示在第一到第四行匹配到的行后 ...

  3. Linux Bash文本操作之sed篇其一

    作为Linux系统中文本处理的强力工具之一,sed功能强大,用法多变,值得我们好好学习. sed是用于过滤和转换文本的流编辑器. 一般情况下sed把当前处理的行存储在临时缓冲区,按指定命令处理之后将缓 ...

  4. awk、grep、sed是linux操作文本的三大利器,也是必须掌握的linux命令之一

    awk.grep.sed是linux操作文本的三大利器,也是必须掌握的linux命令之一.三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂.grep更适合单纯的查找或匹配文 ...

  5. UNIX 系统上的文本操作简介

    http://www.oschina.net/question/129540_53561 UNIX 的基本哲学之一就是创建只做一件事并将这一件事做好的程序(或进程).这一哲学要求认真考虑接口以及结合这 ...

  6. linux 常用文本操作相关命令

    平时工作经常会对文本进行相关操作,包括读写.替换.统计等等,借此整理和学习一下有关命令. 1. cat 查看文件中的内容, -n 查看时为每一行加编号; -b 和-n类似,只不过对于空白行不编号: 2 ...

  7. Linux三剑客之sed流编辑器

    一.功能说明 Sed是Stream Editor(流编辑器)缩写,是操作.过滤和转换文本内容的强大工具.常用功能有增删改查,过滤,取行. 二.语法格式 Usage: sed [options] [se ...

  8. Linux命令-文件文本操作grep

    文件文本操作 grep 在文件中查找符合正则表达式条件的文本行 cut 截取文件中的特定字段 paste 附加字段 tr 字符转换或压缩 sort 调整文本行的顺序,使其符合特定准则 uniq 找出重 ...

  9. IO流(四)__流的操作规律总结

    流的操作规律: 1.明确源和目的 源:InputStream Reader 目的:OutputStream Writer 2.明确数据是否是纯文本数据 源:是纯文本:Reader 否:InputStr ...

  10. C# IO流的操作

    C# IO流的操作非常重要,我们读写文件都会使用到这个技术,这里先演示一个文件内容复制的例子,简要说明C#中的IO操作. namespace ConsoleApplication1 { class P ...

随机推荐

  1. Nginx事件管理之epoll模块

    1. epoll 原理 假设有 100 万用户同时与一个进程保持着 TCP 连接,而每一时刻只有几十个或几百个 TCP 连接时活跃的(接收到 TCP 包),也就是说,在每一时刻,进程只需要处理这 10 ...

  2. Mysql的exist与in的区别

    如果查询的两个表大小相当,那么用in和exists差别不大. 如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:    例如:表A(小表),表B(大表)   1: s ...

  3. If表达式 kotlin(8)

    If表达式 在 Kotlin 中, if 是一个表达式,即它会返回一个值. 因此就不需要三元运算符(条件 ? 然 后 : 否则) ,因为普通的 if 就能胜任这个角色. // 传统用法 var max ...

  4. Delphi之TClientSocket和TServerSocket使用tcp keepalive心跳机制实现“断网”、"断电"检测

    开发环境:Delphi7 测试环境:WinXP,Win7  32bit,Win7 64bit 使用TClientSocket和TServerSocket实现TCP长连接通讯,经常因为断电断网等原因导致 ...

  5. [SQL server2008筛选时报错,无法为该请求检索数据 解决方案]

    当SQL数据太多时,我们需要通过筛选来查询自己需要的数据. 当我在使用SQLserver 2008的时候 遇到了这个错误1 以下是微软提供的解决方案的网址 (SQL SERVER SP1补丁) htt ...

  6. LC 648. Replace Words

    In English, we have a concept called root, which can be followed by some other words to form another ...

  7. 使用ViewFlipper实现广告图片的自动轮播的效果

    轮播资源图片的实现 package com.loaderman.viewflipperdemo; import android.os.Bundle; import android.support.v7 ...

  8. Dialog 对话框

    在保留当前页面状态的情况下,告知用户并承载相关操作. 基本用法 Dialog 弹出一个对话框,适合需要定制性更大的场景. 需要设置visible属性,它接收Boolean,当为true时显示 Dial ...

  9. MYSQL 中 MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比

    1.MyISAM:默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.不 ...

  10. python批量执行shell命令

    [root@master ~]# cat a.py #!/usr/bin/python # -*- coding:UTF- -*- import subprocess def fun(): subpr ...