• 常用选项 | 选项 | 说明 | 备注 | | —- | —- | —- | | -e | 进行多项(多次)编辑 | | | -n | 取消默认输出 | 不自动打印模式空间 | | -r | 使用扩展
    正则表达式 | | | -i | 原地编辑(修改源文件) | | | -f | 指定sed脚本的文件名 | |
  • 常见处理动作

丑话说在前面:以下所有的动作都要在单引号里,你敢出轨,回家跪搓衣板

动作 说明 备注
‘p’ 打印
‘i’ 在指定行之前插入内容 类似vim里的大写O
‘a’ 在指定行之后插入内容 类似vim里的小写o
‘c’ 替换指定行所有内容
‘d’ 删除指定行

p输出

命令 完整示例 说明
p sed -n ‘p’ 1.txt 输出1.txt的所有行
2p sed -n ‘2p’ 1.txt 输出1.txt的第二行
2,5p sed -n ‘2,5p’ 1.txt 输出1.txt的第二行到第五行
2,+5p sed -n ‘2,+5p’ 1.txt 输出1.txt的第二行和第二行以后的5行
1~2p sed -n ‘1~2p’ 1.txt 输出第一行,每隔两行输出一行,也就是输出奇数行
2~2p sed -n ‘1~2p’ 1.txt 输出第二行,每隔两行输出一行,也就是输出偶数数行
/正则/p sed -n ‘/^[0-9]/p’ 1.txt 输出1.txt以数字开头的行
$= sed -n ‘$=’ 1.txt 输出1.txt的行数

d 删除

命令 完整示例 说明
2d sed ‘2d’ 1.txt 删除1.txt的第二行
2,5d sed ‘2,5d’ 1.txt 删除1.txt的第二行到第五行
2,+5d sed ‘2,+5d’ 1.txt 删除1.txt的第二行和第二行以后的5行
“$d” sed ‘$d’ 1.txt 删除1.txt的最后一行行
/正则/ sed ‘/^[0-9]/d’ 1.txt 删除以数字开始的行
sed ‘/^[0-9]/!d’ 1.txt 删除不是以数字开头的行
^$ sed ‘^$’ 1.txt 删除1.txt的空行

s 替换

命令 完整示例 说明
s/old/new/ sed ‘s/old/new/‘ 1.txt 删除1.txt中每行的第一个old都替换成new
s/old/new/2 sed ‘s/old/new/‘ 1.txt 删除1.txt中每行的第二个old都替换成new
s/old/new/g sed ‘s/old/new/g’ 1.txt 删除1.txt中每行的每一个old都替换成new
s/old// sed ‘s/old//‘ 1.txt 删除1.txt中每行的第一个old都替换成空也就是把old删除
s/old/&s/ sed ‘s/old/&s/‘ 1.txt 删除1.txt中每行的第一个old都替换成olds &代表前面查找的字符串
4,7s/^/#/ sed ‘4,7s/^/#/‘ 1.txt 删除1.txt中4-7行开头加上# 也就是批量添加注释
4,7s/^#an/an/ sed ‘4,7s/^#an/an/‘ 1.txt 删除1.txt中4-7行以#an开头的行去掉#

i/a/c插入

命令 完整示例 说明
行号 i sed ‘2i123’ 1.txt 在1.txt的第二行前面插入123
正则 i sed ‘/^[0-9]/i123’ 1.txt 在1.txt中所有数字开头的行前面插入123
a 在行后插入 命令格式和i相同
c 替换该行 命令格式和i相同

sed高级应用

命令 完整示例 说明
行号r sed -i ‘2r 2.txt’ 1.txt 在1.txt中第二行后面插入2.txt的内容
行号,行号r sed -i ‘2,5r 2.txt’ 1.txt 在1.txt中第二行到第五行每行后面插入一遍2.txt的内容
/正则/r sed -i ‘/^[0-9]/r 2.txt’ 1.txt 在1.txt中以数字开头的行后每行面插入一遍2.txt的内容
w sed ‘2w 3.txt’ 1.txt 在1.txt中第二行导出为3.txt的内容
w sed ‘2,5w 3.txt’ 1.txt 在1.txt中第二行到第五行导出3.txt的内容
/正则/r sed -i ‘/^[0-9]/w 2.txt’ 1.txt 在1.txt中以数字开头的行导出为3.txt的内容

一、文件编辑器知多少

  • Windows系统

文本处理工具sed - 图1

  • Linux系统

    vim vi gedit nano emacs

二、强悍的sed介绍

1. sed用来做啥?

sed是Stream Editor(流编辑器)的缩写,简称流编辑器;用来处理文件的。

2. sed如何处理文件?

sed是一行一行读取文件内容并按照要求进行处理,把处理后的结果输出到屏幕。

文本处理工具sed - 图2

  1. 首先sed读取文件中的一行内容,把其保存在一个临时缓存区中(也称为模式空间)
  2. 然后根据需求处理临时缓冲区中的行,完成后把该行发送到屏幕上

总结:

  1. 由于sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会直接修改原文件
  2. Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作,对文件进行过滤和转换操作

三、sed使用方法介绍

sed常见的语法格式有两种,一种叫命令行模式,另一种叫脚本模式。

1. 命令行格式

㈠ 语法格式

sed [options] 处理动作 文件名

  • 常用选项 | 选项 | 说明 | 备注 | | —- | —- | —- | | -e | 进行多项(多次)编辑 | | | -n | 取消默认输出 | 不自动打印模式空间 | | -r | 使用扩展
    正则表达式 | | | -i | 原地编辑(修改源文件) | | | -f | 指定sed脚本的文件名 | |
  • 常见处理动作

丑话说在前面:以下所有的动作都要在单引号里,你敢出轨,回家跪搓衣板

动作 说明 备注
‘p’ 打印
‘i’ 在指定行之前插入内容 类似vim里的大写O
‘a’ 在指定行之后插入内容 类似vim里的小写o
‘c’ 替换指定行所有内容
‘d’ 删除指定行

㈡ 举例说明

  • 文件准备
  1. # vim a.txt
  2. root:x:0:0:root:/root:/bin/bash
  3. bin:x:1:1:bin:/bin:/sbin/nologin
  4. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  5. adm:x:3:4:adm:/var/adm:/sbin/nologin
  6. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  7. 298374837483
  8. 172.16.0.254
  9. 10.1.1.1

① 对文件进行增、删、改、查操作

语法:sed 选项 定位+命令 需要处理的文件

1)打印文件内容
  1. [root@server ~]# sed '' a.txt 对文件什么都不做
  2. [root@server ~]# sed -n 'p' a.txt 打印每一行,并取消默认输出
  3. [root@server ~]# sed -n '1p' a.txt 打印第1
  4. [root@server ~]# sed -n '2p' a.txt 打印第2
  5. [root@server ~]# sed -n '1,5p' a.txt 打印15
  6. [root@server ~]# sed -n '$p' a.txt 打印最后1

2)增加文件内容

i 地址定位的上面插入

a 下面插入

  1. [root@server ~]# sed '$a99999' a.txt 文件最后一行下面增加内容
  2. [root@server ~]# sed 'a99999' a.txt 文件每行下面增加内容
  3. [root@server ~]# sed '5a99999' a.txt 文件第5行下面增加内容
  4. [root@server ~]# sed '$i99999' a.txt 文件最后一行上一行增加内容
  5. [root@server ~]# sed 'i99999' a.txt 文件每行上一行增加内容
  6. [root@server ~]# sed '6i99999' a.txt 文件第6行上一行增加内容
  7. [root@server ~]# sed '/^uucp/ihello' a.txt uucp开头行的上一行插入内容

3)修改文件内容

c 替换指定的整行内容

  1. [root@server ~]# sed '5chello world' a.txt 替换文件第5行内容
  2. [root@server ~]# sed 'chello world' a.txt 替换文件所有内容
  3. [root@server ~]# sed '1,5chello world' a.txt 替换文件15号内容为hello world
  4. [root@server ~]# sed '/^user01/c888888' a.txt 替换以user01开头的行

4)删除文件内容
  1. [root@server ~]# sed '1d' a.txt 删除文件第1
  2. [root@server ~]# sed '1,5d' a.txt 删除文件15
  3. [root@server ~]# sed '$d' a.txt 删除文件最后一行

② 对文件进行搜索替换操作

语法:sed 选项 ‘s/搜索的内容/替换的内容/动作’ 需要处理的文件 其中,s表示search搜索;斜杠/表示分隔符,可以自己定义;动作一般是打印p和全局替换g,不加g只替换每行的第一个 sed 中的 s 默认全部行同vim中的%s 如果需要指定哪一行,可以在s前面加行号

  1. [root@server ~]# sed -n 's/root/ROOT/p' 1.txt
  2. [root@server ~]# sed -n 's/root/ROOT/gp' 1.txt
  3. [root@server ~]# sed -n 's/^#//gp' 1.txt
  4. [root@server ~]# sed -n 's@/sbin/nologin@itcast@gp' a.txt
  5. [root@server ~]# sed -n 's/\/sbin\/nologin/itcast/gp' a.txt
  6. [root@server ~]# sed -n '10s#/sbin/nologin#itcast#p' a.txt
  7. uucp:x:10:14:uucp:/var/spool/uucp:itcast
  8. [root@server ~]# sed -n 's@/sbin/nologin@itcastheima@p' 2.txt
  9. 注意:搜索替换中的分隔符可以自己指定
  10. [root@server ~]# sed -n '1,5s/^/#/p' a.txt 注释掉文件的1-5行内容
  11. #root:x:0:0:root:/root:/bin/bash
  12. #bin:x:1:1:bin:/bin:/sbin/nologin
  13. #daemon:x:2:2:daemon:/sbin:/sbin/nologin
  14. #adm:x:3:4:adm:/var/adm:/sbin/nologin
  15. #lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

③ 其他命令

命令 解释 备注
r 从另外文件中读取内容
w 内容另存为
& 保存查找串以便在替换串中引用 引用/ … /中的内容,只引用一次
\( … \) 可以使用\<位置序号>对()中…进行引用 可以引用多次
= 打印行号
对所选行以外的所有行应用命令,放到行数之后 ‘1,5!’
q 退出

举例说明:

  1. r 从文件中读取输入行
  2. w 将所选的行写入文件
  3. [root@server ~]# sed '3r /etc/hosts' 2.txt
  4. [root@server ~]# sed '$r /etc/hosts' 2.txt
  5. [root@server ~]# sed '/root/w a.txt' 2.txt
  6. [root@server ~]# sed '/[0-9]{4}/w a.txt' 2.txt
  7. [root@server ~]# sed -r '/([0-9]{1,3}\.){3}[0-9]{1,3}/w b.txt' 2.txt
  8. ! 对所选行以外的所有行应用命令,放到行数之后
  9. [root@server ~]# sed -n '1!p' 1.txt
  10. [root@server ~]# sed -n '4p' 1.txt
  11. [root@server ~]# sed -n '4!p' 1.txt
  12. [root@server ~]# cat -n 1.txt
  13. [root@server ~]# sed -n '1,17p' 1.txt
  14. [root@server ~]# sed -n '1,17!p' 1.txt
  15. & 保存查找串以便在替换串中引用 \(\)
  16. [root@server ~]# sed -n '/root/p' a.txt
  17. root:x:0:0:root:/root:/bin/bash
  18. [root@server ~]# sed -n 's/root/#&/p' a.txt
  19. #root:x:0:0:root:/root:/bin/bash
  20. # sed -n 's/^root/#&/p' passwd 注释掉以root开头的行
  21. # sed -n -r 's/^root|^stu/#&/p' /etc/passwd 注释掉以root开头或者以stu开头的行
  22. # sed -n '1,5s/^[a-z].*/#&/p' passwd 注释掉1~5行中以任意小写字母开头的行
  23. # sed -n '1,5s/^/#/p' /etc/passwd 注释1~5行
  24. 或者
  25. sed -n '1,5s/^/#/p' passwd 以空开头的加上#
  26. sed -n '1,5s/^#//p' passwd 以#开头的替换成空
  27. [root@server ~]# sed -n '/^root/p' 1.txt
  28. [root@server ~]# sed -n 's/^root/#&/p' 1.txt
  29. [root@server ~]# sed -n 's/\(^root\)/#\1/p' 1.txt
  30. [root@server ~]# sed -nr '/^root|^stu/p' 1.txt
  31. [root@server ~]# sed -nr 's/^root|^stu/#&/p' 1.txt
  32. = 打印行号
  33. # sed -n '/bash$/=' passwd 打印以bash结尾的行的行号
  34. # sed -ne '/root/=' -ne '/root/p' passwd
  35. # sed -n '/nologin$/=;/nologin$/p' 1.txt
  36. # sed -ne '/nologin$/=' -ne '/nologin$/p' 1.txt
  37. q 退出
  38. 类似程序中的break 满足条件就退出 不再继续
  39. # sed '5q' 1.txt
  40. # sed '/mail/q' 1.txt
  41. # sed -r '/^yunwei|^mail/q' 1.txt
  42. [root@server ~]# sed -n '/bash$/p;10q' 1.txt
  43. ROOT:x:0:0:root:/root:/bin/bash
  44. 综合运用:
  45. [root@server ~]# sed -n '1,5s/^/#&/p' 1.txt
  46. #root:x:0:0:root:/root:/bin/bash
  47. #bin:x:1:1:bin:/bin:/sbin/nologin
  48. #daemon:x:2:2:daemon:/sbin:/sbin/nologin
  49. #adm:x:3:4:adm:/var/adm:/sbin/nologin
  50. #lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  51. [root@server ~]# sed -n '1,5s/\(^\)/#\1/p' 1.txt
  52. #root:x:0:0:root:/root:/bin/bash
  53. #bin:x:1:1:bin:/bin:/sbin/nologin
  54. #daemon:x:2:2:daemon:/sbin:/sbin/nologin
  55. #adm:x:3:4:adm:/var/adm:/sbin/nologin
  56. #lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

④ 其他选项

  1. -e 多项编辑
  2. -r 扩展正则
  3. -i 修改原文件
  4. [root@server ~]# sed -ne '/root/p' 1.txt -ne '/root/='
  5. root:x:0:0:root:/root:/bin/bash
  6. 1
  7. [root@server ~]# sed -ne '/root/=' -ne '/root/p' 1.txt
  8. 1
  9. root:x:0:0:root:/root:/bin/bash
  10. 1.txt文件中的第5行的前面插入“hello world”;在1.txt文件的第8行下面插入“哈哈哈哈”
  11. [root@server ~]# sed -e '5ihello world' -e '8a哈哈哈哈哈' 1.txt -e '5=;8='
  12. sed -n '1,5p' 1.txt
  13. sed -ne '1p' -ne '5p' 1.txt
  14. sed -ne '1p;5p' 1.txt
  15. 过滤vsftpd.conf文件中以#开头和空行:
  16. [root@server ~]# grep -Ev '^#|^$' /etc/vsftpd/vsftpd.conf
  17. [root@server ~]# sed -e '/^#/d' -e '/^$/d' /etc/vsftpd/vsftpd.conf
  18. [root@server ~]# sed '/^#/d;/^$/d' /etc/vsftpd/vsftpd.conf
  19. [root@server ~]# sed -r '/^#|^$/d' /etc/vsftpd/vsftpd.conf
  20. 过滤smb.conf文件中生效的行:
  21. # sed -e '/^#/d' -e '/^;/d' -e '/^$/d' -e '/^\t$/d' -e '/^\t#/d' smb.conf
  22. # sed -r '/^(#|$|;|\t#|\t$)/d' smb.conf
  23. # sed -e '/^#/d' -e '/^;/d' -e '/^$/d' -e '/^\t$/d' -e '/^\t#/' smb.conf
  24. [root@server ~]# grep '^[^a-z]' 1.txt
  25. [root@server ~]# sed -n '/^[^a-z]/p' 1.txt
  26. 过滤出文件中的IP地址:
  27. [root@server ~]# grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}' 1.txt
  28. 192.168.0.254
  29. [root@server ~]# sed -nr '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' 1.txt
  30. 192.168.0.254
  31. [root@server ~]# grep -o -E '([0-9]{1,3}\.){3}[0-9]{1,3}' 2.txt
  32. 10.1.1.1
  33. 10.1.1.255
  34. 255.255.255.0
  35. [root@server ~]# sed -nr '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' 2.txt
  36. 10.1.1.1
  37. 10.1.1.255
  38. 255.255.255.0
  39. 过滤出ifcfg-eth0文件中的IP、子网掩码、广播地址
  40. [root@server shell06]# grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' ifcfg-eth0
  41. 10.1.1.1
  42. 255.255.255.0
  43. 10.1.1.254
  44. [root@server shell06]# sed -nr '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' ifcfg-eth0|cut -d'=' -f2
  45. 10.1.1.1
  46. 255.255.255.0
  47. 10.1.1.254
  48. [root@server shell06]# sed -nr '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' ifcfg-eth0|sed -n 's/[A-Z=]//gp'
  49. 10.1.1.1
  50. 255.255.255.0
  51. 10.1.1.254
  52. [root@server shell06]# ifconfig eth0|sed -n '2p'|sed -n 's/[:a-Z]//gp'|sed -n 's/ /\n/gp'|sed '/^$/d'
  53. 10.1.1.1
  54. 10.1.1.255
  55. 255.255.255.0
  56. [root@server shell06]# ifconfig | sed -nr '/([0-9]{1,3}\.)[0-9]{1,3}/p' | head -1|sed -r 's/([a-z:]|[A-Z/t])//g'|sed 's/ /\n/g'|sed '/^$/d'
  57. [root@server shell06]# ifconfig eth0|sed -n '2p'|sed -n 's/.*addr:\(.*\) Bcast:\(.*\) Mask:\(.*\)/\1\n\2\n\3/p'
  58. 10.1.1.1
  59. 10.1.1.255
  60. 255.255.255.0
  61. -i 选项 直接修改原文件
  62. # sed -i 's/root/ROOT/;s/stu/STU/' 11.txt
  63. # sed -i '17{s/YUNWEI/yunwei/;s#/bin/bash#/sbin/nologin#}' 1.txt
  64. # sed -i '1,5s/^/#&/' a.txt
  65. 注意:
  66. -ni 不要一起使用
  67. p命令 不要再使用-i时使用

⑤ sed结合正则使用

sed 选项 ‘sed命令或者正则表达式或者地址定位’ 文件名

  1. 定址用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的结合。
  2. 如果没有指定地址,sed将处理输入文件的所有行。 | 正则 | 说明 | 备注 | | —- | —- | —- | | /key/ | 查询包含关键字的行 | sed -n ‘/root/p’ 1.txt | | /key1/,/key2/ | 匹配包含两个关键字之间的行 | sed -n ‘/^adm/,/^mysql/p’ 1.txt | | /key/,x | 从匹配关键字的行开始到
    文件第x行
    之间的行(包含关键字所在行) | sed -n ‘/^ftp/,7p’ | | x,/key/ | 从文件的第x行开始到与关键字的匹配行之间的行 | | | x,y! | 不包含x到y行 | | | /key/! | 不包括关键字的行 | sed -n ‘/bash$/!p’ 1.txt |

sed 替换匹配行的下一行
sed -i ‘/pattern/n;s/pattern/TOSTRING/‘ TARGET_DATASTREAM

2. 脚本格式

㈠ 用法

  1. # sed -f scripts.sh file //使用脚本处理文件
  2. 建议使用 ./sed.sh file
  3. 脚本的第一行写上
  4. #!/bin/sed -f
  5. 1,5d
  6. s/root/hello/g
  7. 3i777
  8. 5i888
  9. a999
  10. p

㈡ 注意事项

  1. 1) 脚本文件是一个sed的命令行清单。'commands'
  2. 2) 在每行的末尾不能有任何空格、制表符(tab)或其它文本。
  3. 3) 如果在一行中有多个命令,应该用分号分隔。
  4. 4) 不需要且不可用引号保护命令
  5. 5) #号开头的行为注释

㈢举例说明

  1. # cat passwd
  2. stu3:x:509:512::/home/user3:/bin/bash
  3. stu4:x:510:513::/home/user4:/bin/bash
  4. stu5:x:511:514::/home/user5:/bin/bash
  5. # cat sed.sh
  6. #!/bin/sed -f
  7. 2a\
  8. ******************
  9. 2,$s/stu/user/
  10. $a\
  11. we inster new line
  12. s/^[a-z].*/#&/
  13. [root@server ~]# cat 1.sed
  14. #!/bin/sed -f
  15. 3a**********************
  16. $chelloworld
  17. 1,3s/^/#&/
  18. [root@server ~]# sed -f 1.sed -i 11.txt
  19. [root@server ~]# cat 11.txt
  20. #root:x:0:0:root:/root:/bin/bash
  21. #bin:x:1:1:bin:/bin:/sbin/nologin
  22. #daemon:x:2:2:daemon:/sbin:/sbin/nologin
  23. **********************
  24. adm:x:3:4:adm:/var/adm:/sbin/nologin
  25. helloworld

3. 补充扩展总结

  1. 1、正则表达式必须以”/“前后规范间隔
  2. 例如:sed '/root/d' file
  3. 例如:sed '/^root/d' file
  4. 2、如果匹配的是扩展正则表达式,需要使用-r选来扩展sed
  5. grep -E
  6. sed -r
  7. + ? () {n,m} | \d
  8. 注意:
  9. 在正则表达式中如果出现特殊字符(^$.*/[]),需要以前导 "\" 号做转义
  10. eg:sed '/\$foo/p' file
  11. 3、逗号分隔符
  12. 例如:sed '5,7d' file 删除5到7行
  13. 例如:sed '/root/,/ftp/d' file
  14. 删除第一个匹配字符串"root"到第一个匹配字符串"ftp"的所有行本行不找 循环执行
  15. 4、组合方式
  16. 例如:sed '1,/foo/d' file 删除第一行到第一个匹配字符串"foo"的所有行
  17. 例如:sed '/foo/,+4d' file 删除从匹配字符串”foo“开始到其后四行为止的行
  18. 例如:sed '/foo/,~3d' file 删除从匹配字符串”foo“开始删除到3的倍数行(文件中)
  19. 例如:sed '1~5d' file 从第一行开始删每五行删除一行
  20. 例如:sed -nr '/foo|bar/p' file 显示配置字符串"foo"或"bar"的行
  21. 例如:sed -n '/foo/,/bar/p' file 显示匹配从foo到bar的行
  22. 例如:sed '1~2d' file 删除奇数行
  23. 例如:sed '0-2d' file 删除偶数行 sed '1~2!d' file
  24. 5、特殊情况
  25. 例如:sed '$d' file 删除最后一行
  26. 例如:sed '1d' file 删除第一行
  27. 6、其他:
  28. sed 's/.//' a.txt 删除每一行中的第一个字符
  29. sed 's/.//2' a.txt 删除每一行中的第二个字符
  30. sed 's/.//N' a.txt 从文件中第N行开始,删除每行中第N个字符(N>2)
  31. sed 's/.$//' a.txt 删除每一行中的最后一个字符
  32. [root@server ~]# cat 2.txt
  33. 1 a
  34. 2 b
  35. 3 c
  36. 4 d
  37. 5 e
  38. 6 f
  39. 7 u
  40. 8 k
  41. 9 o
  42. [root@server ~]# sed '/c/,~2d' 2.txt
  43. 1 a
  44. 2 b
  45. 5 e
  46. 6 f
  47. 7 u
  48. 8 k
  49. 9 o

四、课堂练习

  1. 将任意数字替换成空或者制表符
  2. 去掉文件1-5行中的数字、冒号、斜杠
  3. 匹配root关键字替换成hello itcast,并保存到test.txt文件中
  4. 删除vsftpd.conf、smb.conf、main.cf配置文件里所有注释的行及空行(不要直接修改原文件)
  5. 使用sed命令截取自己的ip地址
  6. 使用sed命令一次性截取ip地址、广播地址、子网掩码
  7. 注释掉文件的2-3行和匹配到以root开头或者以ftp开头的行
  1. 1、将文件中任意数字替换成空或者制表符
  2. 2、去掉文件1-5行中的数字、冒号、斜杠
  3. 3、匹配root关键字的行替换成hello itcast,并保存到test.txt文件中
  4. 4、删除vsftpd.confsmb.confmain.cf配置文件里所有注释的行及空行(不要直接修改原文件)
  5. 5、使用sed命令截取自己的ip地址
  6. # ifconfig eth0|sed -n '2p'|sed -n 's/.*addr://pg'|sed -n 's/Bcast.*//gp'
  7. 10.1.1.1
  8. # ifconfig eth0|sed -n '2p'|sed 's/.*addr://g'|sed 's/ Bcast:.*//g'
  9. 6、使用sed命令一次性截取ip地址、广播地址、子网掩码
  10. # ifconfig eth0|sed -n '2p'|sed -n 's#.*addr:\(.*\) Bcast:\(.*\) Mask:\(.*\)#\1\n\2\n\3#p'
  11. 10.1.1.1
  12. 10.1.1.255
  13. 255.255.255.0
  14. 7、注释掉文件的2-3行和匹配到以root开头或者以ftp开头的行
  15. # sed -nr '2,3s/^/#&/p;s/^ROOT|^ftp/#&/p' 1.txt
  16. #ROOT:x:0:0:root:/root:/bin/bash
  17. #bin:x:1:1:bin:/bin:/sbin/nologin
  18. #3daemon:x:2:2:daemon:/sbin:/sbin/nologin
  19. # sed -ne '1,2s/^/#&/gp' a.txt -nre 's/^lp|^mail/#&/gp'
  20. # sed -nr '1,2s/^/#&/gp;s/^lp|^mail/#&/gp' a.txt

五、课后实战

1、写一个初始化系统的脚本
1)自动修改主机名(如:ip是192.168.0.88,则主机名改为server88.itcast.cc)

a. 更改文件非交互式 sed

/etc/sysconfig/network

b.将本主机的IP截取出来赋值给一个变量ip;再然后将ip变量里以.分割的最后一位赋值给另一个变量ip1

2)自动配置可用的yum源

3)自动关闭防火墙和selinux

2、写一个搭建ftp服务的脚本,要求如下:
1)不支持本地用户登录 local_enable=NO
2) 匿名用户可以上传 新建 删除 anon_upload_enable=YES anon_mkdir_write_enable=YES
3) 匿名用户限速500KBps anon_max_rate=500000

  1. 仅供参考:
  2. #!/bin/bash
  3. ipaddr=`ifconfig eth0|sed -n '2p'|sed -e 's/.*inet addr:\(.*\) Bcast.*/\1/g'`
  4. iptail=`echo $ipaddr|cut -d'.' -f4`
  5. ipremote=192.168.1.10
  6. #修改主机名
  7. hostname server$iptail.itcast.com
  8. sed -i "/HOSTNAME/cHOSTNAME=server$iptail.itcast.com" /etc/sysconfig/network
  9. echo "$ipaddr server$iptail.itcast.cc" >>/etc/hosts
  10. #关闭防火墙和selinux
  11. service iptables stop
  12. setenforce 0 >/dev/null 2>&1
  13. sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
  14. #配置yum源(一般是内网源)
  15. #test network
  16. ping -c 1 $ipremote > /dev/null 2>&1
  17. if [ $? -ne 0 ];then
  18. echo "你的网络不通,请先检查你的网络"
  19. exit 1
  20. else
  21. echo "网络ok."
  22. fi
  23. cat > /etc/yum.repos.d/server.repo << end
  24. [server]
  25. name=server
  26. baseurl=ftp://$ipremote
  27. enabled=1
  28. gpgcheck=0
  29. end
  30. #安装软件
  31. read -p "请输入需要安装的软件,多个用空格隔开:" soft
  32. yum -y install $soft &>/dev/null
  33. #备份配置文件
  34. conf=/etc/vsftpd/vsftpd.conf
  35. \cp $conf $conf.default
  36. #根据需求修改配置文件
  37. sed -ir '/^#|^$/d' $conf
  38. sed -i '/local_enable/c\local_enable=NO' $conf
  39. sed -i '$a anon_upload_enable=YES' $conf
  40. sed -i '$a anon_mkdir_write_enable=YES' $conf
  41. sed -i '$a anon_other_write_enable=YES' $conf
  42. sed -i '$a anon_max_rate=512000' $conf
  43. #启动服务
  44. service vsftpd restart &>/dev/null && echo"vsftpd服务启动成功"
  45. #测试验证
  46. chmod 777 /var/ftp/pub
  47. cp /etc/hosts /var/ftp/pub
  48. #测试下载
  49. cd /tmp
  50. lftp $ipaddr <<end
  51. cd pub
  52. get hosts
  53. exit
  54. end
  55. if [ -f /tmp/hosts ];then
  56. echo "匿名用户下载成功"
  57. rm -f /tmp/hosts
  58. else
  59. echo "匿名用户下载失败"
  60. fi
  61. #测试上传、创建目录、删除目录等
  62. cd /tmp
  63. lftp $ipaddr << end
  64. cd pub
  65. mkdir test1
  66. mkdir test2
  67. put /etc/group
  68. rmdir test2
  69. exit
  70. end
  71. if [ -d /var/ftp/pub/test1 ];then
  72. echo "创建目录成功"
  73. if [ ! -d /var/ftp/pub/test2 ];then
  74. echo "文件删除成功"
  75. fi
  76. else
  77. if [ -f /var/ftp/pub/group ];then
  78. echo "文件上传成功"
  79. else
  80. echo "上传、创建目录删除目录部ok"
  81. fi
  82. fi
  83. [ -f /var/ftp/pub/group ] && echo "上传文件成功"