huashan8 发表于 2018-8-22 11:41:01

sed工具与正则表达式的使用(shell第四天)

  sed工具    【流式编辑器】
  —— 非交互,基于模式匹配过滤及修改文本
  —— 逐行处理,并将结果输出到屏幕
  ——可实现对文本的输出,删除,替换,复制,剪切,导入,导出等各种操作
  命令格式:
  1)前置命令 | sed[选项]'条件指令'【利用管道】
  2)sed[选项]'条件指令'文件.. ..
  常用选项:
  -n          屏蔽默认输出,默认sed会输出读取文档的全部内容
  -i          sed直接修改源文件,默认sed只是通过内存临时修改文件,源文件无影响
  [正常情况下,sed命令所做的处理只是把操作结果(包括打印、删除等)输出到当前终端屏幕,而并不会对原始文件做任何更改]
  -r         (让sed支持扩展正则)
  例:
  -n
  查看文件/etc/hosts第1行
  # sed-n '1p'/etc/hosts
  127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
  查看/etc/passwd 3-6行
  # sed -n '3,6p'    /etc/passwd
  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
  查看文件/etc/passwd第3行和第6行
  # sed -n '3p;6p' /etc/passwd
  daemon:x:2:2:daemon:/sbin:/sbin/nologin
  sync:x:5:0:sync:/sbin:/bin/sync
  -i
  删除文件进行逐条删除【实际未对文件进行修改】
  # sed'd'/wooo.txt
  # cat /wooo.txt
  thekncxn;zcnk
  dagahao the
  wojiaozazahuithekoa
  修改源文件【慎用】
  # sed -i 'd' /wooo.txt
  # cat /wooo.txt
  二) 认识sed工具的条件
sed [选项] '条件指令' 文件.. ..
  1)sed命令可以使用行号或正则做为条件匹配:
  sed -n '3p' /etc/passwd             打印第3行
  sed -n '3,5p' /etc/passwd          打印第3到5行
  sed -n '3p;5p' /etc/passwd      打印第3和5行
  sed -n '3,+10p' /etc/passwd      打印第3以及后面的10行
  sed -n '1~2p' /etc/passwd         打印奇数行
  sed -n '2~2p' /etc/passwd         打印偶数行
  2)正则案例
  【采用//把需要搜索的内容查找出来】
  sed -n '/root/p' /etc/passwd       打印包含root的行
  sed -n '/bash$/p' /etc/passwd      打印bash结尾的行[可以登陆的用户]
  三)指令集合
  【打印】p
  sed-n 'p' a.txt                   输出所有行,等同于cat a.txt
  sed-n '4p' a.txt               输出第4行
  sed-n '4,7p' a.txt            输出第4~7行
  sed-n '4,+10p' a.txt          输出第4行及其后的10行内容
  sed-n '/^bin/p' a.txt      输出以bin开头的行
  sed-n '$=' a.txt                输出文件的行数
  # sed -n '$=' /etc/passwd
  47            [后面无目录显示]
  # wc -l /etc/passwd
  47 /etc/passwd
  【删除】d    注:练习时不需加 i ,防止文件误删!
  sed'3,5d' a.txt               删除第3~5行
  sed'/xml/d' a.txt             删除所有包含xml的行
  sed'/xml/!d' a.txt            删除不包含xml的行,!符号表示取反
  sed'/^install/d' a.txt       删除以install开头的行
  sed'$d' a.txt                  删除文件的最后一行
  sed'/^$/d' a.txt            删除所有空行
  【替换】s         (s/旧内容/新内容/选项)
  vimtest.txt                     练习环境
  2017 2011 2018
  2017 2017 2024
  2017 2017 2017
  sed 's/2017/xxxx/'             test.txt替换所有行匹配的第一个2017
  sed 's/2017/xxxx/g'          test.txt替换所有的2017
  sed 's/2017/xxxx/2'          test.txt替换所有行匹配的第二个2017
  sed 's/2017//2'               test.txt将所有行匹配的第二个2017删除
  sed '2s/2017/xxx/2'          test.txt将第二行匹配的第二个2017删除
  sed '2~2s/2017/xxx/g'      test.txt替换偶数行的2017
  sed -n 's/2017/x# vim anonftp.shxxx/p'       test.txt打印
  sed    '4,7s/^/#/'         a.txt         //将第4~7行注释掉(行首加#号)
  sed    's/^#an/an/'          a.txt         //解除以#an开头的行的注释(去除行首的#号)
  ifconfig | sed -n '2s/netm.//p' | sed 's/.t//'   查看ip
  172.25.0.11
  sed 's/\/bin\/bash/\sbin\/sh/' /etc/passwd
  sed's#/bin/bash#/sbin/sh/#' /etc/passwd
  将首字母和尾字母调换
  sed-r's/^(.)(.*)(.)$/\3\2\1/' /wooo.txt
  【每行文本拆分为“第1个字符”、“中间的所有字符”、“倒数第1个字符”三个部分,然后通过替换操作重排顺序为“3-2-1”】
  dello worlh
  oa ga had
  io xi za za huw
  将所有大写字母加大括号
  sed -r 's/()/[\1]/' /wooo.txt
  hell world
  d ga hao
  o xi za za hui
  编写脚本:【实现自动安装ftp软件包并配置他人可访问和上传】
  通过yum安装vsftpd软件包
  修改vsftpd服务配置,开启匿名上传
  调整/var/ftp/pub目录权限,允许ftp写入
  启动vsftpd服务,并设置开机自运行
  #!/bin/bash
  yum -y install vsftpd
  cp /etc/vsftpd/vsftpd.conf{,.back}
  sed-i 's/^#an/an/'/etc/vsftpd/vsftpd.conf
  chmod 777 /var/ftp/pub
  systemctlrestart vsftpd
  systemctlenable vsftpd
  无法访问常见原因
  1)防火墙未打开
  2)selinux未打开
  3)重启服务
  sed [选项]'条件指令'   文件.....
  选项 :-n -i -r
  条件:行号,/正则/
  指令 :p,d,s,a,i,c
  a,append追加,后
  i,insert插入,前
  c,把该行删除并插入
  :r   读入
  :w另存为
  sed '2r /etc/hosts'   tmp.txt   将文件tmp.txt读入到文件/etc/hosts的第二行
  sed 'w /root/b.txt'   tmp.txt   将文件tmp.txt另存为文件root/b.txt内
  sed '2w/root/b.txt'   tmp.txt   将
  脚本:筛选用户并显示密码
  #!/bin/bash
  a=sed -n /bash$/s/:.*//p/etc/passwd
  for i in $a
  do
  pass=grep $i /etc/shadow
  pass1=${pass#:}
  pass2=${pass1%%:}
  echo "$i ------>$pass2"
  done

页: [1]
查看完整版本: sed工具与正则表达式的使用(shell第四天)