SED命令详解

SED常用功能

  1. 处理文本文件
  2. 分析日志文件
  3. 修改配置文件

SED处理流程

文本或管道输入—-读入一行到模式空间(临时缓冲区)—-sed命令处理—–输出到屏幕—-读入一行到模式空间—–循环

SED原则

  1. sed一次处理一行内容
  2. sed不改变文件内容(除非重定向或者 -i 参数)
  3. sed可以对所有行进行操作,也可以根据正则选择选定行

SED的格式

  1. 命令行格式
    sed [options] ‘command’ file
    options: -e -n -i
    command: 行定位(或正则)+ sed命令(操作)
  2. 脚本格式
    sed -f script file

SED命令

-p:           –/etc 下的passwd文件

  1. sed ‘p’ passwd
    输出两行同样内容,因为sed本身就是输出到屏幕,然后‘p’命令再一次打印
  2. sed -n ‘p’ passwd
    -n 忽略默认输出//  nl passwd       打印文件并带行号
    //  nl -b a passwd        打印文件并带行号且空行也计算行数

行定位

  1. sed -n ’10p’ passwd        定位一行
  2. sed -n ‘/besttest/p’ passwd       使用正则表达式,用//间隔
  3. sed -n ‘6,10p’ passwd        定位多行
  4. sed -n ‘/mail/,/besttest/p’ passwd       定位多行正则匹配
  5. sed -n ’16,/besttest/p’ passwd       定位多行从第16行到匹配行
  6. sed -n ’10!p’ passwd       不选择这一行
  7. sed -n ‘6,10!p’ passwd       不选择多行
  8. sed -n ‘4~3p’ passwd        从第4行开始,每三行打印一次  开始行~步长

基本操作命令

a(新增行)/i(插入行)
c(替代行)
d(删除行)

  1. sed ’12a======’ passwd        在第12行后增加=======
  2. sed ’12i======’ passwd         在第12行前增加=======
  3. sed ‘1,5a=====’ passwd          在1到5行后面全都增加=======
  4. sed ‘5c======’ passwd          第五行替换成======
  5. sed ‘2,5c=====’ passwd          把2-5行全替换成======
  6. sed ‘5d’ passwd       删除第5行
  7. sed ‘2,5d’ passwd     删除2-5行

练习:profile文件中最后一行添加内容——–$表示最后一行,内容前面如果需要加空格,那么在a后面               加 然后在加空格
eg:sed -n ‘$a    export TOMCAT_HOME=XXXXX      export PATH=$PATH:$TOMCAT’ profile  >> profile
eg:sed -i ‘$a    export TOMCAT_HOME=XXXXX      export PATH=$PATH:$TOMCAT’ profile

练习:删除空白行—–^代表开始,$代表结束
eg:sed ‘/^$/d’ passwd

练习:服务器日志处理,log中打印error信息
eg:sed -n ‘/error/p’ file.log

替换操作

s:

  1. sed ‘s/old/new/’ passwd     替换操作
  2. sed ‘s/:/$/g’ passwd         g 全局替换,否则每行只替换第一个

练习:获取eth0中的ip       .*代表所有的
eg:ifconfig | sed -n ‘/inet.*broadcast/p’ | sed ‘s/inets+//’ | sed ‘s/s+netmask.*//’
先获取有ip的那行,然后把ip前面替换成空,后面替换成空,空格占位符是s,+代表一个以上且要转义。

sed高级操作

{}:多个sed命令,用;隔开,然后用{}括起来。
eg:nl -b a passwd | sed ‘{10,20d;s/:/%/g}’
删除10-20行,并且把:替换成%。(不加{}也可以)
eg:nl -b a passwd | sed -n ‘{n;n;p}’
读取下一个输入行

&:替换固定的字符串,代表前面匹配的字符
eg:sed ‘s/^[a-z_-]+/& /’ passwd
用户名后面统一添加空格

练习:将用户名的首字母转换为大写
u    l:对首字母转成大写或小写
U    L:对一串字符转成大写或小写
eg:sed ‘s/^[a-z_-]+/u&/’ passwd
eg:ls | sed ‘s/.*/U&/’

():需要转义(),代表替换某部分字符串(12)
eg:sed ‘s/w1(w2)(w3)/12/’ xxx.txt

练习:获取eth0中的ip
eg:ifconfig | sed -n ‘/inet.*broadcast/p’ | sed ‘s/inet.*s+([0-9.]+)s+netmask.*/1/’
注意:如果取值前面包含空格使用.*不好使,需要s+代表空格,否则取不到值。
eg:ifconfig | sed -n ‘/inet.*broadcast/p’ | sed ‘s/inets+([0-9.]+).*netmasks+([0-9.]+).*broa*.*s+([0-9.]+)/1/’
替换123取不同的值

练习:获取passwd文件中,用户名、uid、gid
eg:sed ‘s/(^[a-z_-]+):x:([0-9]+):([0-9]+).*/1 2 3/’ passwd

sed的读写操作

r:读取指定文件插入到匹配行
sed ‘1r 123.txt’ abd.txt
读文件不会更改文件内容    1r 代表从第几行开始
w:复制匹配行拷贝到指定文件里
sed ‘1w 123.txt’ abc.txt              复制abc文件的第一行到123的文件中去,123文件内容会变化。
写操作会清除目标文件内容,然后再写内容进去。

sed退出操作

q:退出sed,使用q可以提前退出sed
nl -b a passwd | sed ’10q’         打印前10行。
nl -b a passwd | sed ‘/false/q’         打印直到出现false为止

sed连续命令

e:

nl -b a passwd | sed -e ‘10,20d’ -e ‘s/:/%/g’

 

原文地址:https://www.cnblogs.com/xiaowenshu/p/9957084.html