在shell编程中,大多数处理的都是文本文件。对文本文件进行处理除了使用交互式文本编辑器(vi[m],gedit......)也可以使用另外一类:流编辑器。

  流编辑器:使用预定义的编辑规则来对文本进行处理。如sed,gawk

本文将会记录学习的sed的一些命令,以及一些正则联合使用来对文本进行操作案例.


第一部分:sed简述

1.1 sed的使用方法

  sed编辑器是以行为单位来对文本处理的编辑器。它的使用方法有两种:

  sed [选项]  命令  目标文本

  sed [选项]  -f  脚本文件  目标文件

  其中的脚本文件是预先定义好的一些脚本文件,来对目标文件进行处理。

1.2 sed的工作流程

  sed每次从输入读取一行数据,讲数据与所提供的编辑器命令匹配,根据命令修改数据流中的数据,然后会将新数据输出到标准输出上。如果想要保存修改,需要将修改进行重定向。


第二部分 sed常用命令与示例

  2.1 打印行

    p:打印当前文本文件的指定内容(可指定行或者使用正则表达式匹配指定)

    -n:忽略当前文本内容的自动打印。也就是说默认情况下,sed命令会讲文本处理结果输出到标准输出(终端界面),使用该命令可以关闭自动输出结果到屏幕。

    -n常与p命令联合使用。

  简单应用

  1. 示例:简单应用
  2. $ sed 'p' passwd | head -n  
  3. root:x:::root:/root:/bin/bash
  4. root:x:::root:/root:/bin/bash
  5. daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
  6. daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
  7.  
  8. $ sed -n 'p' passwd | head -n
  9. root:x:::root:/root:/bin/bash
  10. daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
  11. bin:x:::bin:/bin:/usr/sbin/nologin
  12. sys:x:::sys:/dev:/usr/sbin/nologin

    我们可以看到使用p命令打印时,会讲每一行都会输出两次,原因就是sed是对行操作,将一行读取到缓存后,会对这一行按照p命令打印,同时也会默认自动打印。使用-n命令后,文件每行内容只输出一遍。

  打印单行

  1. 示例:打印单行
  2.  
  3. #指定打印第二行
  4. $ nl passwd| sed -n '2p'    
  5. daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
  6.  
  7. #指定打印含有root字符的行
  8. $sed -n '/root/p' passwd       
  9. root:x:::root:/root:/bin/bash
  10. #注意:通过正则表达式对文本内容匹配时需要按照/****/的形式使用正则表达式

  打印多行 

  1. 示例:打印多行
  2.  
  3. #打印2-5
  4. $ nl passwd | sed -n '2,5p'
  5. daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
  6. bin:x:::bin:/bin:/usr/sbin/nologin
  7. sys:x:::sys:/dev:/usr/sbin/nologin
  8. sync:x:::sync:/bin:/bin/sync
  9.  
  10. #使用正则打印daemonsync行的内容
  11. $ nl passwd | sed -n '/root/,/qi/p'
  12. root:x:::root:/root:/bin/bash
  13. daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
  14. ......篇幅有限,内容省略......
  15. qi:x:::zhuandshao,,,:/home/qi:/bin/bash

   不打印某些行

  1. 示例:不打印某一行
  2.  
  3. #不打印第1行  使用!进行反选取操作
  4. $ nl passwd | sed -n '1!p'
  5. daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
  6. bin:x:::bin:/bin:/usr/sbin/nologin
  7. sys:x:::sys:/dev:/usr/sbin/nologin
  8.  
  9. #不打印1-3行 
  10. $ nl passwd | sed -n '1,3!p'
  11. sys:x:::sys:/dev:/usr/sbin/nologin
  12. sync:x:::sync:/bin:/bin/sync
  13. games:x:::games:/usr/games:/usr/sbin/nologin

  间隔取行

  1. 示例:间隔取行
  2.  
  3. #使用first~step 这样的形式来进行间隔几行的操作
  4. $ nl passwd | sed -n '1~3p'
  5. root:x:::root:/root:/bin/bash
  6. sys:x:::sys:/dev:/usr/sbin/nologin
  7. man:x:::man:/var/cache/man:/usr/sbin/nologin

  2.2 新增行、插入行 

    a:在每行的行后新增加一行。可使用行号或模式匹配

    i:在指定行前插入一行。可使用行号或模式匹配

  简单应用

  1. 示例:简单应用
  2.  
  3. #新增一行  
  4. $ nl passwd|sed '1a\ this is a new line behind first line'  #注:使用\是为了转义空格以便输出格式对齐
  5. root:x:::root:/root:/bin/bash
  6. this is a new line behind first line
  7. daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
  8.  
  9. #插入一行
  10. $ nl passwd|sed '1i\ this is a new line before first line'
  11. this is a new line before first line
  12. root:x:::root:/root:/bin/bash
  13. daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin

  范围新增多行与范围插入多行

  1. 示例:范围新增多行与范围插入多行

  2. \n:换行
  3. $ nl passwd|sed '1,2a\ this is a new line behind two lines \n this is second line' | head
  4. root:x:::root:/root:/bin/bash
  5. this is a new line behind two lines 
  6. this is second line
  7. daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
  8. this is a new line behind two lines 
  9. this is second line
  10. bin:x:::bin:/bin:/usr/sbin/nologin
  11. sys:x:::sys:/dev:/usr/sbin/nologin
  12.  
  13. $ nl passwd|sed '1,2i\ this is a new line before two lines  n this is second line' | head
  14. this is a new line before two lines 
  15. this is second line
  16. root:x:::root:/root:/bin/bash
  17. this is a new line before two lines 
  18. this is second line
  19. daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
  20. bin:x:::bin:/bin:/usr/sbin/nologin

  间隔多行插入或者增加

  1. 示例:间隔多行插入或者增加
  2.  
  3. $ nl passwd|sed '1~2i\ this is a new line before two lines \n this is second line' | head
  4. this is a new line before two lines 
  5. this is second line
  6. root:x:::root:/root:/bin/bash
  7. daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
  8. this is a new line before two lines 
  9. this is second line
  10. bin:x:::bin:/bin:/usr/sbin/nologin
  11. sys:x:::sys:/dev:/usr/sbin/nologin
  12.  
  13. #增加与插入类似,略

  

  2.3 替代行

    c:替代指定行,可使用行号或模式匹配

  1. 示例:简单使用
  2.  
  3. #替换一行
  4. $ nl passwd | sed '1c this is a replace line '| head
  5. this is a replace line
  6. daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
  7. bin:x:::bin:/bin:/usr/sbin/nologin
  8.  
  9. $ nl passwd | sed '/root/c this is a replace line '| head
  10. this is a replace line
  11. daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
  12. bin:x:::bin:/bin:/usr/sbin/nologin
  13.  
  14. #多行整体替换
  15. $ nl passwd | sed '1,5c this is a replace line '| head
  16. this is a replace line
  17. games:x:::games:/usr/games:/usr/sbin/nologin
  18. man:x:::man:/var/cache/man:/usr/sbin/nologin
  19.  
  20. $ nl passwd | sed '/root/,/qi/c this is a replace line '| head
  21. this is a replace line
  22. sshd:x::::/run/sshd:/usr/sbin/nologin
  23. statd:x::::/var/lib/nfs:/bin/false

  2.4 删除行

    d:删除指定行,可使用行号或模式匹配

  

  1. 示例:简单使用
  2.  
  3. #删除一行
  4. $ nl passwd | sed '1d'
  5. daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
  6. bin:x:::bin:/bin:/usr/sbin/nologin
  7.  
  8. $ nl passwd | sed '/root/d'
  9. daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
  10. bin:x:::bin:/bin:/usr/sbin/nologin
  11.  
  12. #删除多行
  13. $ nl passwd | sed '1,42 d'
  14. sshd:x::::/run/sshd:/usr/sbin/nologin
  15. statd:x::::/var/lib/nfs:/bin/false
  16.  
  17. $ nl passwd | sed '/root/,/qi/d'
  18. sshd:x::::/run/sshd:/usr/sbin/nologin
  19. statd:x::::/var/lib/nfs:/bin/false
  20.  
  21. #间隔删除
  22. $ nl passwd | sed '1~2 d'
  23. daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
  24. sys:x:::sys:/dev:/usr/sbin/nologin
  25. games:x:::games:/usr/games:/usr/sbin/nologin

  2.5 字符转换

    y:将原字符一一转换成目标字符,如y/abc/123/ :将文本中的a-->1 , b-->2 , c--> 3.

  1. 示例:
  2. $ sed 'y/rs/12/' passwd
  3. 1oot:x:::1oot:/1oot:/bin/ba2h
  4. daemon:x:::daemon:/u21/2bin:/u21/2bin/nologin
  5. bin:x:::bin:/bin:/u21/2bin/nologin
  6. 2y2:x:::2y2:/dev:/u21/2bin/nologin
  7. 2ync:x:::2ync:/bin:/bin/2ync

  2.6 内容替换

    s:替换匹配的指定的字符,使用方法:s/pattern/replacemet/[flags]

      s命令可用的flags有:

        g:替换所有与pattern匹配的文本,而不是只匹配第一个

        n:n代表数字,指定替换第n个与pattern匹配的文本。默认为第一个。

        w file:如果替换成功就将其写入到file文件中。

        

  1. 示例:
  2.  
  3. $ sed 's/false/true/' passwd | grep true
  4. systemd-timesync:x:::systemd Time Synchronization,,,:/run/systemd:/bin/true
  5.  
  6. $ sed 's/:/ % /' passwd #匹配到第一个:就停止了匹配,如果想要替换所有的,就需要使用全局替换
  7. root % x:::root:/root:/bin/bash
  8. daemon % x:::daemon:/usr/sbin:/usr/sbin/nologin
  9.  
  10. #全局替换 使用g命令
  11. $ sed 's/:/ % /g' passwd | head
  12. root % x % % % root % /root % /bin/bash
  13. daemon % x % % % daemon % /usr/sbin % /usr/sbin/nologin
  14.  
  15. #指定第几个替换
    $ sed 's/:/ % /3' passwd
    root:x:0 % 0:root:/root:/bin/bash
    daemon:x:1 % 1:daemon:/usr/sbin:/usr/sbin/nologin
  16.  
  17. #将成功替换的内容写入到file文件里
    $ sed -n 's/qi/qiqi/w file' passwd ; cat file
    qiqi:x:1000:1000:zhuandshao,,,:/home/qi:/bin/bash
  18.  

第三部分 sed高级命令与示例

  3.1 {}

    {command1;command2;......commandn}:顺序执行多个sed命令

  1. 示例:
    $ sed -n '{s/root/test/;1p}' passwd
  2. test:x:::root:/root:/bin/bash

  3.2 &

    &:匹配整个字符串,替换时常使用    

  1. 示例:
  2.  
  3. $ sed 's/root/&123/' #使用g参数可以全部替换
  4. root123:x:::root:/root:/bin/bash
  5. daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin

  3.2 \(...\)

     \(...\):匹配子字符串,与\1(子字符串匹配标记,匹配到的第一个子串标记为\1,第二个为\2,以此类推)联合使用。替换时常使用

  1. 使用示例见:
  2. 数据筛选--选取用户名、UIDGID

第四部分:实用案例

数据筛选

  4.1  使用sed输出网卡ip地址(192.168.0.100)的几种方式:

    网卡输出信息如下:

  1. 网卡输出信息:
  2. $ ifconfig
  3. enp1s0: flags=<UP,BROADCAST,MULTICAST> mtu
  4. ether :d2:::4d: txqueuelen (以太网)
  5. RX packets bytes (9.4 KB)
  6. RX errors dropped overruns frame
  7. TX packets bytes (10.3 KB)
  8. TX errors dropped overruns carrier collisions
  9.  
  10. lo: flags=<UP,LOOPBACK,RUNNING> mtu
  11. inet 127.0.0.1 netmask 255.0.0.0
  12. inet6 :: prefixlen scopeid 0x10<host>
  13. loop txqueuelen (本地环回)
  14. RX packets bytes (313.9 KB)
  15. RX errors dropped overruns frame
  16. TX packets bytes (313.9 KB)
  17. TX errors dropped overruns carrier collisions
  18.  
  19. wlp2s0: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
  20. inet 192.168.0.100 netmask 255.255.255.0 broadcast 192.168.0.255
  21. inet6 fe80::a67b:d8cd:4fab:56bb prefixlen scopeid 0x20<link>
  22. ether b8:ee::1f:a0:d7 txqueuelen (以太网)
  23. RX packets bytes (25.1 MB)
  24. RX errors dropped overruns frame
  25. TX packets bytes (1.5 MB)
  26. TX errors dropped overruns carrier collisions

    4.1.1  使用空格分别替换ip地址前半部分以及后半部分的内容,已达到筛选出ip地址的效果

  1. $ ifconfig wlp2s0 | sed -n '/inet /p' | sed 's/inet //'| sed 's/net.*//'
  2. 192.168.0.100

    4.1.2 使用子串匹配替换:通过将ip地址标记的子串与ip输出信息替换,也就是使用192.168.0.100替换inet 192.168.0.100 netmask 255.255.255.0 broadcast 192.168.0.255 达到输出ip地址的目的。

  1. $ ifconfig wlp2s0 | sed -n '/inet /p' | sed 's/inet \([0-9.]\+\).*$/\1/'
  2. 192.168.0.100

    4.1.3 使用gawk来输出ip地址

  1. $ ifconfig wlp2s0 | sed -n '/inet /p' | gawk '{print $2}'
  2. 192.168.0.100

  4.2 在passwd文件中筛选出用户名、GID、UID

  1. #匹配用户名:\(^[a-z_-]\+\)
    #匹配ID:\([0-9]\+\)
  2.  
  3. $ sed 's/\(^[a-z_-]\+\):x:\([0-9]\+\):\([0-9]\+\):.*$/ USER=\1 UID=\2 GID=\3/' passwd
  4. USER=root UID= GID=
  5. USER=daemon UID= GID=
  6. USER=bin UID= GID=
  7. USER=sys UID= GID=
  8. USER=sync UID= GID=
  9. USER=games UID= GID=

  4.3 转换大小写

    /u /l :分别将首字母转换成大写、小写

    /U /L :分别将一查UN字符转换成大写、小写

    

    4.3.1 将用户名首字母转换成大写     

  1. $ sed 's/[a-z_-]\+/\u&/' passwd
  2. Root:x:::root:/root:/bin/bash
  3. Daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
  4. Bin:x:::bin:/bin:/usr/sbin/nologin

    4.3.2 将文件名全部转换成大写

  1. $ ls *.sh | sed 's/^\w\+/\U&/'
  2. AUTO-creat-shell-script.sh
  3. CANSHU_SHELL.sh
  4. CHECK_FILE.sh
  5. GUI-msgbox.sh

  4.4 奇偶行输出

    4.4.1 使用n命令。n:读取下一个输入行。

  1. 示例:
  2. #输出偶数行
  3. $ nl passwd|sed -n '{n;p}'
  4. daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
  5. sys:x:::sys:/dev:/usr/sbin/nologin
  6. games:x:::games:/usr/games:/usr/sbin/nologin
  7. lp:x:::lp:/var/spool/lpd:/usr/sbin/nologin
  8.  
  9. #输出奇数行
  10. $ nl passwd|sed -n '{p;n}'
  11. root:x:::root:/root:/bin/bash
  12. bin:x:::bin:/bin:/usr/sbin/nologin
  13. sync:x:::sync:/bin:/bin/sync

    4.4.2 使用间隔输出实现奇偶行输出 

  1. 示例:
  2. #输出偶数行
  3. $ nl passwd|sed -n '2~2p'
  4. daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
  5. sys:x:::sys:/dev:/usr/sbin/nologin
  6. games:x:::games:/usr/games:/usr/sbin/nologin
  7. lp:x:::lp:/var/spool/lpd:/usr/sbin/nologin
  8.  
  9. #输出奇数行
  10. $ nl passwd|sed -n '1~2p'
  11. root:x:::root:/root:/bin/bash
  12. bin:x:::bin:/bin:/usr/sbin/nologin
  13. sync:x:::sync:/bin:/bin/sync
  14. man:x:::man:/var/cache/man:/usr/sbin/nologin

  

      

shell编程学习笔记之sed编辑器的更多相关文章

  1. Linux Shell编程学习笔记——目录(附笔记资源下载)

    LinuxShell编程学习笔记目录附笔记资源下载 目录(?)[-] 写在前面 第一部分 Shell基础编程 第二部分 Linux Shell高级编程技巧 资源下载 写在前面 最近花了些时间学习She ...

  2. shell编程学习笔记(一):编写我的第一段代码

    目前在学习Shell编程,我会把我的学习笔记记录在这里.大神可以直接略过~ 嗯,第一段代码,肯定是要输出Hello World了~ 以下蓝色字体的内容为linux命令,红色字体的内容为输出的内容: # ...

  3. shell编程学习笔记【原创】

    本文为本人学习笔记,如有转载请注明出处,谢谢 一.Bourne Shell 有如下四种变量: 用户自定义变量 位置变量,即命令行参数 预定义变量 环境变量 二.位置变量 $ 与键入的命令行一样,包含脚 ...

  4. shell编程学习笔记(十):Shell中的for循环

    shell编程中可以实现for循环遍历 先来写一个最简单的吧,循环输出从1到10,脚本内容为: #! /bin/sh for i in {1..10} do echo $i done 上面的代码从1到 ...

  5. shell编程学习笔记(八):Shell中的if条件判断

    编程语言中都有条件判断,shell编程也不例外,下面我们来看一下shell中应该怎么使用if条件判断 以下蓝色字体部分为Linux命令,红色字体的内容为输出的内容: # cd /opt/scripts ...

  6. shell编程学习笔记(六):cat命令的使用

    这一篇不是讲shell编程的,专门讲cat命令.shell编程书用到了这个cat命令,顺便说一下cat命令. cat命令有多种用法,我一一来列举(以下蓝色字体部分为Linux命令,红色字体的内容为输出 ...

  7. shell编程学习笔记(五):Shell中脚本的参数

    在执行Shell脚本的时候,可以在执行时带上参数,相当于传递参数给脚本,下面我们看一下怎么使用这个参数 以下蓝色字体部分为Linux命令,红色字体的内容为输出的内容: # cd /opt/script ...

  8. shell编程学习笔记之特殊变量($0、$1、$2、 $?、 $# 、$@、 $*)

    特殊变量($0.$1.$2. $?. $# .$@. $*) shell编程中有一些特殊的变量可以使用.这些变量在脚本中可以作为全局变量来使用. 名称 说明 $0 脚本名称 $1-9 脚本执行时的参数 ...

  9. shell脚本学习笔记 (流编辑器sed)

    sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用很普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出. sed不 ...

随机推荐

  1. Python目录整合

    一.python基础篇 二.网络编程篇&&并发编程篇 三.数据库篇 -mysql -redis -mongodb 四.前端篇 -html -css -js jquery&&am ...

  2. mac配置python自然语言处理环境

    一.nltk安装 Ⅰ.工具安装步骤 1.根据python版本从 https://pypi.python.org/pypi/setuptools 下载对应版本的setuptools.然后,在终端下运行, ...

  3. node.js---sails项目开发

    http://sailsdoc.swift.ren/ 这里有 sails中文文档 node.js---sails项目开发(1)安装,启动sails node.js---sails项目开发(2)安装测试 ...

  4. Linux修改信息

    修改时间 sudo date -s MM/DD/YY //修改日期 sudo date -s hh:mm:ss //修改时间 在修改时间以后,修改硬件CMOS的时间 sudo hwclock --sy ...

  5. Yii2 教程 - yii2-redis 扩展详解

    该教程已被合并到<Yii2 权威指南中文版>中!Yiichina 教程地址为<yii2-redis 扩展详解>! 一.简介 yii2-redis 扩展为 Yii2 框架提供了 ...

  6. jmeter接口测试实战

    请求方法:get/post 接口请求地址:http://172.22.24.26:8080/fundhouse/external/getdata?name=xxxx &fund_udid=35 ...

  7. 自定义admin管理工具(stark组件)

    自定义admin管理工具(stark组件) 创建项目 了解了admin的功能后,我们可以开始仿照admin编写我们自己的管理工具stark组件 首先创建一个新的项目,并创建三个app stark就是我 ...

  8. SQL Server outer apply 和 cross apply

    先说点题外话,因为后面我会用到这个函数. 前两天自定义了一个 sql 的字符串分割函数(Split),不过后来发现有点问题,例如: select * from Split(default,'123,4 ...

  9. 接口API中的敏感数据基于AES进行安全加密后返回

    许久没有写博客了,有些惶恐地打开这个再熟悉不过的编辑器. 场景:要对一个涉及到敏感数据(账号.密码)的接口进行加密后返回 由于之前没有相关的经验,所以先在网上搜罗了一阵,这篇博客不错https://w ...

  10. 【Q2D】 2048设计

    主要组件 1: GameDirector ,负责胜利.失败.载入上次成绩等 2: Grid, 表格类,负责管理tile二维数组 3: Tile 元素类,就是界面上移动的砖块了 4: InputHelp ...