sed工作流程:
sed称为流编辑器,它一次是处理一行的内容,处理时,把当前匹配到的行存储在临时缓冲区中,名为“模式空间”,接着sed命令就处理缓冲区中的内容,处理完后,就把内容输送到屏幕,然后接着处理下一行,直到文件的末尾。sed命令并不会修改原文件的内容,如果你使用sed -i 或者输出结果重定向。sed主要就是用来减少对文件的直接编辑,简化操作。
sed先读取到第一行,然后保存在模式空间中,然后通过匹配给定的正则表达式来编辑读取到的行,存储在sed的另外一个模式空间中,叫保持空间。不能被表达式匹配的行就直接标准输出至屏幕。
sed命令:
sed [option]..'script'[input-file]...
script:地址定界编辑命令 比如:1~2d //删除奇数行
[option]:
-n:不输出模式空间中的内容至屏幕
-e:多点编辑
[root@magedu ~]# sed -e '1~2d' -e '^#' /etc/fstab
-f /path/to/sed_script_file :每行一个编辑命令
-r:支持使用扩展的正则表达式
-i:直接编辑原文件
地址定界:
1、不给地址,直接为空:表示对全文进行处理
2、单地址:
#,指定行
/pattern/:对匹配到的每一行进行处理
3、地址范围:
#,#:表示第#行第#行 3 , 8 : 从第3行到第8行
#,+#:表示从第#行开始往下加#行,包括第#行 3,+8 : 从第三行往下加8行,总共9行
#,/pattern/:表示从#行到所匹配到的行
$:表示最后一行
4、步进:~
1~2:表示所有奇数行
2~2:表示所有偶数行
编辑命令:
d:删除
[root@magedu ~]# sed '1,5d' /etc/fstab //删除1到5行 [root@magedu ~]# sed '1~2d' /etc/fstab //删除奇数行
p:显示模式空间中的内容
[root@magedu ~]# sed '1~2p' /etc/fstab //奇数行显示两遍
a \text:在行后面追加文本“text",支持使用\n实现多行追加;
i \text:在行前面加入文本“text”,支持使用\n实现多行插入;
[root@magedu ~]# sed '/^#/a \add new_line' /etc/fstab //#开头的后一行加入add.. [root@magedu ~]# sed '/^#/i \add new_line' /etc/fstab //#开头的前一行加入add..
c \text:把匹配到的行替换为此处指定的文本“text”;
[root@magedu ~]# sed '/^#/i \add new_line' /etc/fstab //#开头的行替换成add..
w /path/to/somefile:保存模式空间中匹配到的行到指定目录的文件中
[root@magedu ~]# sed '/^#/w /tmp/file.txt' /etc/fstab //保存到/tmp目录下的file 文件中
r /path/from/somefile:读取指定的文件的内容至当前文件模式所匹配到的行数
[root@magedu ~]# sed '3r /etc/issue' /etc/fstab # # /etc/fstab //第三行后面加入/etc/issue的内容 \S Kernel \r on an \m # Created by anaconda on Fri Mar 11 15:49:25 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
=:为模式匹配到的行在前一行打印出行号
[root@magedu ~]# sed '/^#/=' /etc/fstab 2 # 3 # /etc/fstab 4 # Created by anaconda on Fri Mar 11 15:49:25 2016
!:条件取反 地址定界!编辑命令
[root@magedu ~]# sed '3!d' /etc/fstab # /etc/fstab
s///:查找替换,其分隔符可自行指定,常用的有s@@@,s###等;
替换标记:
g:全局替换
w /path/to/somefile:将替换成功的结果保存至指定文件中;
p:显示替换成功的行;
比如:删除/etc/fstab文件中所有以#开头的#以及#后面接的一个或多个空白字符
[root@magedu ~]# sed 's@^#[[:space:]]*@@' /etc/fstab /etc/fstab Created by anaconda on Fri Mar 11 15:49:25 2016 Accessible filesystems, by reference, are maintained under '/dev/disk' See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info /dev/mapper/centos-root / xfs defaults 0 0
输出一个路径,取出其路径名
[root@magedu ~]# echo "/etc/passwd" |sed 's@[^/]\+/\?$@@' /etc/
用ifconfig命令,输出其IP地址:
[root@magedu ~]# ifconfig |grep 'inet\>' |sed -e 's@inet@@' -e 's@net.*@@'|sed 's@127.*@@' 172.18.254.97
给定一文件,里面有6个网址,找出其域名并统计域名的个数
http://www.baidu.com/index.html
http://www.baidu.com/1.html
http://post.baidu.com/index.html
http://mp3.baidu.com/index.html
http://www.baidu.com/3.html
http://post.baidu.com/2.html
[root@magedu ~]# cat 2.txt |sed -e 's@http://@@' -e 's@/.*@@' |sort -n |uniq -c 1 mp3.baidu.com 2 post.baidu.com 3 www.baidu.com
高级编辑命令:
h:把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g:把保持空间中的内容覆盖至模式空间中
G:把保持空间中的内容追加至模式空间中
x:把模式空间中的内容和模式空间中的内容互换
n:读取匹配到的行的下一行覆盖至模式空间中
N:读取匹配到的行的下一行追加至模式空间中
d:删除模式空间中的行
D;删除多行模式空间中的所有行
示例:
sed -n 'n;p' file:显示偶数行 不加-n的话偶数行显示两次
[root@magedu tmp]# sed -n 'n;p' /etc/fstab # # Created by anaconda on Fri Mar 11 15:49:25 2016 # Accessible filesystems, by reference, are maintained under '/dev/disk' # UUID=a7eac9cf-1cdc-4919-8e5d-001170bbffdf /boot xfs defaults 0 0 /dev/sdb1 /mydata ext4 defaults 0 0
先分析下,sed先读取一行,然后执行n,把第二行的内容覆盖了存在模式空间中的第一行,然后显示模式空间中的内容,然后第一和第二行内容存入到保持空间中,然后sed又读取第三行,直到读取完文本。
sed '1!G;h;$!d file:逆序输出
[root@magedu tmp]# sed '1!G;h;$!d' /etc/fstab UUID=787d5a9a-b31f-4104-84ab-0a0a07fbeb72 /md0 ext4 defaults 0 0 /dev/sdb1 /mydata ext4 defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 UUID=a7eac9cf-1cdc-4919-8e5d-001170bbffdf /boot xfs defaults 0 0 /dev/mapper/centos-root / xfs defaults 0 0 # # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # Accessible filesystems, by reference, are maintained under '/dev/disk' # # Created by anaconda on Fri Mar 11 15:49:25 2016 # /etc/fstab #
sed先读取第一行,因为是第一行,执行h,把第一行覆盖到保持空间中,不是末行就删除,就把模式空间的第一行删除了,读取第二行,不是第一行就执行G,把保持空间也就是第一行追加到了模式空间中,然后执行h,把第二行和第一行覆盖到保持空间中,不是末行就删除模式空间中的第二行和第一行,然后读取第三行,直到文件末尾。保持空间中排序就是n-1.......,3,2,1行,直到最后一行。
sed '$!d' file:显示最后一行
[root@magedu tmp]# sed '$!d' /etc/fstab UUID=787d5a9a-b31f-4104-84ab-0a0a07fbeb72 /md0 ext4 defaults 0 0
sed '$!N;$!D' file: 显示最后两行
[root@magedu tmp]# sed '$!N;$!D' /etc/fstab /dev/sdb1 /mydata ext4 defaults 0 0 UUID=787d5a9a-b31f-4104-84ab-0a0a07fbeb72 /md0 ext4 defaults 0 0
sed 'n;d' file : 显示奇数行
[root@magedu tmp]# sed 'n;d' /etc/fstab # /etc/fstab # # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info /dev/mapper/centos-root / xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 UUID=787d5a9a-b31f-4104-84ab-0a0a07fbeb72 /md0 ext4 defaults 0 0
让每行都有空格:sed 'G' file
[root@magedu tmp]# sed 'G' /etc/fstab # # /etc/fstab # Created by anaconda on Fri Mar 11 15:49:25 2016 #