文本三剑客之sed的常用解析

sed

用法:sed +选项+模式或范围+编辑命令(sed脚本)+文件路径


常用选项

-n:不输出模式空间内容到屏幕,即不自动打印
-e: 多点编辑
-f:/PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本 -r: 支持使用扩展正则表达式
-i.bak: 备份文件并原处编辑


范围或模式

从/etc/passwd复制一份到当前文件夹,名为passwd文件为例 ,用cat命令配合管道看更直观 cat -n passwd |sed .....

  1. 表示最后一行 '$'

    sed -n '$p' passwd
    
  2. 表示1行 '#'

    sed -n '1p' passwd 
    
  3. 表示1-5行 '#,#'

    sed -n '1,5p' passwd
    
  4. 表示第1行向后5行 '#,+#'

    sed -n '1,+5p' passwd
    
  5. 表示向后间隔2行 '#~#'

    1)奇数行

    sed -n '1~2p'  passwd
    

    2)偶数行

    sed -n '2~2p'  passwd  
    
  6. 表示root开头到bin开头的行 '/pat1/,/pat2/'

    sed -n '/^root/,/^bin/p'  passwd
    
  7. 表示第三行到a开头的行 '#,/pat/'

    sed -n '3,/\<a/p'
    

编辑命令

d: 删除模式空间匹配的行,并立即启用下一轮循环
例:删除1,40行

cat -n passwd |sed  '1,40d'  

——————

p:打印当前模式空间内容,追加到默认输出之后 
例:删除1至40行并打印 (注意d;p之间用;因为代表两条命令,选项带n,表示关闭自动打印)

cat -n passwd |sed -n '1,40d;p'  

——————

\:在指定行后面追加文本
例:在1至10行后添加666

cat -n passwd |sed  '1,10a\ 666'

例:在1至10行后追加空行 (支持使用\n实现多行追加)

cat -n passwd |sed  '1,10a\ \n'  

——————

\:在行前面插入文本 
例:在1至10行前添加999

cat -n passwd |sed  '1,10a\ 999'

——————

\:替换行为单行或多行文本 
例:把含有root单词的行全替换为 Blank_line

cat -n passwd |sed  '/\<root\>/c\ Blank_line'

——————

w : 保存模式匹配的行至指定文件
例:把passwd文件中root开头的行直接写入到f111文件

sed '/^root/w f111' passwd     

——————

r :读取指定文件的文本至模式空间中
例:把passwd文件中带root的行后都读一个/etc/issue内容在后面

sed '/root/r /etc/issue' passwd

——————

=: 为模式空间中的行打印行号 
例:在含有root的行前面加上行号

sed '/root/=' passwd

——————

!: 模式空间中匹配行取反处理
例:除了第10行都打印

sed -n '10!p' passwd

s///:查找替换,也可用s@@@,s### (支持正则表达式)

替换标记
g:行内全局替换(不添加只替换找到的第一个)
p:显示替换成功的行
w:将替换成功的行保存至文件中

例:把passwd中root全部替换成ROOT并打印:

cat -n passwd |sed -n 's/root/ROOT/gp'

练习:

  1. 在文件/etc/default/grub中在GRUBCMDLINELINUX行尾"前添加 net.ifnames=0

    sed -i.bak -r 's/(LINUX.*)"/\1 net.ifnames=0"/' /etc/default/grub  
    

    或 (用关键字替换)

    sed -i.bak -r 's/(.*)"$/\1 net.ifnames=0"/' /etc/default/grub
    

    或 (先用LINUX匹配行,之后用s//替换)

    sed -i.bak -r '/LINUX/s/"$/net.ifnames=0"/' /etc/default/grub
    
  2. 用sed命令提取ip地址

    Centos7

     ifconfig ens37| sed -rn '2s/.*inet (.*) netmask.*/\1/p'
    

    Centos6

    ifconfig eth1 |sed -rn '2s/.*inet addr:(.*) Bcast.*/\1/p'  
    
    ifconfig eth1 |sed -rn '2s/(.*inet addr:)(.*)( Bcast.*)/\2/p'
    
    ifconfig eth1 |sed -n '2p'|sed 's/^.*addr://'|sed 's/ Bcast.*//'
    
  3. 提取基名提取文件名

    echo "etc/sysconfig/network-scripts" |sed -r 's#(^.*/)([^/]+/?$)#\2#'
    
  4. 去除某一个文件中前面的前面一段的#号
    例:去掉passwd文件中gnome到tcpdump行前面的井号 思路:1,选定范围 2,查找替换

    sed '/^#gnome/,/^#tcpdump/s/#//' /data/passwd  
    
  5. 没有井号的行添加#号 例:为/data/fstab文件中添加没有#号的行添加#号

    sed -r 's/^([^#])/#\1/' /data/fstab
    sed 's/^[^#]/#&/'  /data/fstab  
    

    (&代表s///中第1条和第2条斜线中的内容)

  6. 把/etc/fstab文件中内容大小写转换 \u大写 \l小写

    cat /etc/fstab  |sed -r 's/[[:alpha:]]/\u&/g'
    cat /etc/fstab  |sed -r 's/[[:alpha:]]/\l&/g' 
    
  7. 提取版本号

    sed -r 's/[^[:digit:]]+([0-9]+).*/\1/' /etc/centos-release
    
  8. 为当前文件夹内文件添加一个随机数(有变量外边注意用双引号,或用三个单引把变量引起来)

    ls |sed "s/.*/&_$RANDOM/"
    ls |sed 's/.*/&_'''$RANDOM'''/'
    
  9. 打印空行行号

    sed -n '/^$/=' file1
    
  10. 删除井号开头和空行

    sed '/^$/d;/^#/d' file1
    

sed高级编辑命令用法 (待完善)

P:打印模式空间开端至\n内容,并追加到默认输出之前

h: 把模式空间中的内容覆盖至保持空间中

H:把模式空间中的内容追加至保持空间中

g: 从保持空间取出数据覆盖至模式空间

G:从保持空间取出内容追加至模式空间

x: 把模式空间中的内容与保持空间中的内容进行互换

n: 读取匹配到的行的下一行覆盖至模式空间

N:读取匹配到的行的下一行追加至模式空间

d: 删除模式空间中的行

D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环

猜你喜欢

转载自blog.csdn.net/weixin_40001704/article/details/81486678