shell编程学习笔记之sed编辑器
在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命令联合使用。
简单应用
- 示例:简单应用
- $ sed 'p' passwd | head -n
- root:x:::root:/root:/bin/bash
- root:x:::root:/root:/bin/bash
- daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
- daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
- $ sed -n 'p' passwd | head -n
- root:x:::root:/root:/bin/bash
- daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
- bin:x:::bin:/bin:/usr/sbin/nologin
- sys:x:::sys:/dev:/usr/sbin/nologin
我们可以看到使用p命令打印时,会讲每一行都会输出两次,原因就是sed是对行操作,将一行读取到缓存后,会对这一行按照p命令打印,同时也会默认自动打印。使用-n命令后,文件每行内容只输出一遍。
打印单行
- 示例:打印单行
- #指定打印第二行
- $ nl passwd| sed -n '2p'
- daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
- #指定打印含有root字符的行
- $sed -n '/root/p' passwd
- root:x:::root:/root:/bin/bash
- #注意:通过正则表达式对文本内容匹配时需要按照/****/的形式使用正则表达式
打印多行
- 示例:打印多行
- #打印2-5行
- $ nl passwd | sed -n '2,5p'
- daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
- bin:x:::bin:/bin:/usr/sbin/nologin
- sys:x:::sys:/dev:/usr/sbin/nologin
- sync:x:::sync:/bin:/bin/sync
- #使用正则打印daemon到sync行的内容
- $ nl passwd | sed -n '/root/,/qi/p'
- root:x:::root:/root:/bin/bash
- daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
- ......篇幅有限,内容省略......
- qi:x:::zhuandshao,,,:/home/qi:/bin/bash
不打印某些行
- 示例:不打印某一行
- #不打印第1行 使用!进行反选取操作
- $ nl passwd | sed -n '1!p'
- daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
- bin:x:::bin:/bin:/usr/sbin/nologin
- sys:x:::sys:/dev:/usr/sbin/nologin
- #不打印1-3行
- $ nl passwd | sed -n '1,3!p'
- sys:x:::sys:/dev:/usr/sbin/nologin
- sync:x:::sync:/bin:/bin/sync
- games:x:::games:/usr/games:/usr/sbin/nologin
间隔取行
- 示例:间隔取行
- #使用first~step 这样的形式来进行间隔几行的操作
- $ nl passwd | sed -n '1~3p'
- root:x:::root:/root:/bin/bash
- sys:x:::sys:/dev:/usr/sbin/nologin
- man:x:::man:/var/cache/man:/usr/sbin/nologin
2.2 新增行、插入行
a:在每行的行后新增加一行。可使用行号或模式匹配
i:在指定行前插入一行。可使用行号或模式匹配
简单应用
- 示例:简单应用
- #新增一行
- $ nl passwd|sed '1a\ this is a new line behind first line' #注:使用\是为了转义空格以便输出格式对齐
- root:x:::root:/root:/bin/bash
- this is a new line behind first line
- daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
- #插入一行
- $ nl passwd|sed '1i\ this is a new line before first line'
- this is a new line before first line
- root:x:::root:/root:/bin/bash
- daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
范围新增多行与范围插入多行
- 示例:范围新增多行与范围插入多行
#\n:换行- $ nl passwd|sed '1,2a\ this is a new line behind two lines \n this is second line' | head
- root:x:::root:/root:/bin/bash
- this is a new line behind two lines
- this is second line
- daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
- this is a new line behind two lines
- this is second line
- bin:x:::bin:/bin:/usr/sbin/nologin
- sys:x:::sys:/dev:/usr/sbin/nologin
- $ nl passwd|sed '1,2i\ this is a new line before two lines n this is second line' | head
- this is a new line before two lines
- this is second line
- root:x:::root:/root:/bin/bash
- this is a new line before two lines
- this is second line
- daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
- bin:x:::bin:/bin:/usr/sbin/nologin
间隔多行插入或者增加
- 示例:间隔多行插入或者增加
- $ nl passwd|sed '1~2i\ this is a new line before two lines \n this is second line' | head
- this is a new line before two lines
- this is second line
- root:x:::root:/root:/bin/bash
- daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
- this is a new line before two lines
- this is second line
- bin:x:::bin:/bin:/usr/sbin/nologin
- sys:x:::sys:/dev:/usr/sbin/nologin
- #增加与插入类似,略
2.3 替代行
c:替代指定行,可使用行号或模式匹配
- 示例:简单使用
- #替换一行
- $ nl passwd | sed '1c this is a replace line '| head
- this is a replace line
- daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
- bin:x:::bin:/bin:/usr/sbin/nologin
- $ nl passwd | sed '/root/c this is a replace line '| head
- this is a replace line
- daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
- bin:x:::bin:/bin:/usr/sbin/nologin
- #多行整体替换
- $ nl passwd | sed '1,5c this is a replace line '| head
- this is a replace line
- games:x:::games:/usr/games:/usr/sbin/nologin
- man:x:::man:/var/cache/man:/usr/sbin/nologin
- $ nl passwd | sed '/root/,/qi/c this is a replace line '| head
- this is a replace line
- sshd:x::::/run/sshd:/usr/sbin/nologin
- statd:x::::/var/lib/nfs:/bin/false
2.4 删除行
d:删除指定行,可使用行号或模式匹配
- 示例:简单使用
- #删除一行
- $ nl passwd | sed '1d'
- daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
- bin:x:::bin:/bin:/usr/sbin/nologin
- $ nl passwd | sed '/root/d'
- daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
- bin:x:::bin:/bin:/usr/sbin/nologin
- #删除多行
- $ nl passwd | sed '1,42 d'
- sshd:x::::/run/sshd:/usr/sbin/nologin
- statd:x::::/var/lib/nfs:/bin/false
- $ nl passwd | sed '/root/,/qi/d'
- sshd:x::::/run/sshd:/usr/sbin/nologin
- statd:x::::/var/lib/nfs:/bin/false
- #间隔删除
- $ nl passwd | sed '1~2 d'
- daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
- sys:x:::sys:/dev:/usr/sbin/nologin
- games:x:::games:/usr/games:/usr/sbin/nologin
2.5 字符转换
y:将原字符一一转换成目标字符,如y/abc/123/ :将文本中的a-->1 , b-->2 , c--> 3.
- 示例:
- $ sed 'y/rs/12/' passwd
- 1oot:x:::1oot:/1oot:/bin/ba2h
- daemon:x:::daemon:/u21/2bin:/u21/2bin/nologin
- bin:x:::bin:/bin:/u21/2bin/nologin
- 2y2:x:::2y2:/dev:/u21/2bin/nologin
- 2ync:x:::2ync:/bin:/bin/2ync
2.6 内容替换
s:替换匹配的指定的字符,使用方法:s/pattern/replacemet/[flags]
s命令可用的flags有:
g:替换所有与pattern匹配的文本,而不是只匹配第一个
n:n代表数字,指定替换第n个与pattern匹配的文本。默认为第一个。
w file:如果替换成功就将其写入到file文件中。
- 示例:
- $ sed 's/false/true/' passwd | grep true
- systemd-timesync:x:::systemd Time Synchronization,,,:/run/systemd:/bin/true
- $ sed 's/:/ % /' passwd #匹配到第一个:就停止了匹配,如果想要替换所有的,就需要使用全局替换
- root % x:::root:/root:/bin/bash
- daemon % x:::daemon:/usr/sbin:/usr/sbin/nologin
- #全局替换 使用g命令
- $ sed 's/:/ % /g' passwd | head
- root % x % % % root % /root % /bin/bash
- daemon % x % % % daemon % /usr/sbin % /usr/sbin/nologin
- #指定第几个替换
$ sed 's/:/ % /3' passwd
root:x:0 % 0:root:/root:/bin/bash
daemon:x:1 % 1:daemon:/usr/sbin:/usr/sbin/nologin- #将成功替换的内容写入到file文件里
$ sed -n 's/qi/qiqi/w file' passwd ; cat file
qiqi:x:1000:1000:zhuandshao,,,:/home/qi:/bin/bash
第三部分 sed高级命令与示例
3.1 {}
{command1;command2;......commandn}:顺序执行多个sed命令
- 示例:
$ sed -n '{s/root/test/;1p}' passwd- test:x:::root:/root:/bin/bash
3.2 &
&:匹配整个字符串,替换时常使用
- 示例:
- $ sed 's/root/&123/' #使用g参数可以全部替换
- root123:x:::root:/root:/bin/bash
- daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
3.2 \(...\)
\(...\):匹配子字符串,与\1(子字符串匹配标记,匹配到的第一个子串标记为\1,第二个为\2,以此类推)联合使用。替换时常使用
- 使用示例见:
- 数据筛选--选取用户名、UID、GID
第四部分:实用案例
数据筛选
4.1 使用sed输出网卡ip地址(192.168.0.100)的几种方式:
网卡输出信息如下:
- 网卡输出信息:
- $ ifconfig
- enp1s0: flags=<UP,BROADCAST,MULTICAST> mtu
- ether :d2:::4d: txqueuelen (以太网)
- RX packets bytes (9.4 KB)
- RX errors dropped overruns frame
- TX packets bytes (10.3 KB)
- TX errors dropped overruns carrier collisions
- lo: flags=<UP,LOOPBACK,RUNNING> mtu
- inet 127.0.0.1 netmask 255.0.0.0
- inet6 :: prefixlen scopeid 0x10<host>
- loop txqueuelen (本地环回)
- RX packets bytes (313.9 KB)
- RX errors dropped overruns frame
- TX packets bytes (313.9 KB)
- TX errors dropped overruns carrier collisions
- wlp2s0: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
- inet 192.168.0.100 netmask 255.255.255.0 broadcast 192.168.0.255
- inet6 fe80::a67b:d8cd:4fab:56bb prefixlen scopeid 0x20<link>
- ether b8:ee::1f:a0:d7 txqueuelen (以太网)
- RX packets bytes (25.1 MB)
- RX errors dropped overruns frame
- TX packets bytes (1.5 MB)
- TX errors dropped overruns carrier collisions
4.1.1 使用空格分别替换ip地址前半部分以及后半部分的内容,已达到筛选出ip地址的效果
- $ ifconfig wlp2s0 | sed -n '/inet /p' | sed 's/inet //'| sed 's/net.*//'
- 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地址的目的。
- $ ifconfig wlp2s0 | sed -n '/inet /p' | sed 's/inet \([0-9.]\+\).*$/\1/'
- 192.168.0.100
4.1.3 使用gawk来输出ip地址
- $ ifconfig wlp2s0 | sed -n '/inet /p' | gawk '{print $2}'
- 192.168.0.100
4.2 在passwd文件中筛选出用户名、GID、UID
- #匹配用户名:\(^[a-z_-]\+\)
#匹配ID:\([0-9]\+\)- $ sed 's/\(^[a-z_-]\+\):x:\([0-9]\+\):\([0-9]\+\):.*$/ USER=\1 UID=\2 GID=\3/' passwd
- USER=root UID= GID=
- USER=daemon UID= GID=
- USER=bin UID= GID=
- USER=sys UID= GID=
- USER=sync UID= GID=
- USER=games UID= GID=
4.3 转换大小写
/u /l :分别将首字母转换成大写、小写
/U /L :分别将一查UN字符转换成大写、小写
4.3.1 将用户名首字母转换成大写
- $ sed 's/[a-z_-]\+/\u&/' passwd
- Root:x:::root:/root:/bin/bash
- Daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
- Bin:x:::bin:/bin:/usr/sbin/nologin
4.3.2 将文件名全部转换成大写
- $ ls *.sh | sed 's/^\w\+/\U&/'
- AUTO-creat-shell-script.sh
- CANSHU_SHELL.sh
- CHECK_FILE.sh
- GUI-msgbox.sh
4.4 奇偶行输出
4.4.1 使用n命令。n:读取下一个输入行。
- 示例:
- #输出偶数行
- $ nl passwd|sed -n '{n;p}'
- daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
- sys:x:::sys:/dev:/usr/sbin/nologin
- games:x:::games:/usr/games:/usr/sbin/nologin
- lp:x:::lp:/var/spool/lpd:/usr/sbin/nologin
- #输出奇数行
- $ nl passwd|sed -n '{p;n}'
- root:x:::root:/root:/bin/bash
- bin:x:::bin:/bin:/usr/sbin/nologin
- sync:x:::sync:/bin:/bin/sync
4.4.2 使用间隔输出实现奇偶行输出
- 示例:
- #输出偶数行
- $ nl passwd|sed -n '2~2p'
- daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
- sys:x:::sys:/dev:/usr/sbin/nologin
- games:x:::games:/usr/games:/usr/sbin/nologin
- lp:x:::lp:/var/spool/lpd:/usr/sbin/nologin
- #输出奇数行
- $ nl passwd|sed -n '1~2p'
- root:x:::root:/root:/bin/bash
- bin:x:::bin:/bin:/usr/sbin/nologin
- sync:x:::sync:/bin:/bin/sync
- man:x:::man:/var/cache/man:/usr/sbin/nologin
shell编程学习笔记之sed编辑器的更多相关文章
- Linux Shell编程学习笔记——目录(附笔记资源下载)
LinuxShell编程学习笔记目录附笔记资源下载 目录(?)[-] 写在前面 第一部分 Shell基础编程 第二部分 Linux Shell高级编程技巧 资源下载 写在前面 最近花了些时间学习She ...
- shell编程学习笔记(一):编写我的第一段代码
目前在学习Shell编程,我会把我的学习笔记记录在这里.大神可以直接略过~ 嗯,第一段代码,肯定是要输出Hello World了~ 以下蓝色字体的内容为linux命令,红色字体的内容为输出的内容: # ...
- shell编程学习笔记【原创】
本文为本人学习笔记,如有转载请注明出处,谢谢 一.Bourne Shell 有如下四种变量: 用户自定义变量 位置变量,即命令行参数 预定义变量 环境变量 二.位置变量 $ 与键入的命令行一样,包含脚 ...
- shell编程学习笔记(十):Shell中的for循环
shell编程中可以实现for循环遍历 先来写一个最简单的吧,循环输出从1到10,脚本内容为: #! /bin/sh for i in {1..10} do echo $i done 上面的代码从1到 ...
- shell编程学习笔记(八):Shell中的if条件判断
编程语言中都有条件判断,shell编程也不例外,下面我们来看一下shell中应该怎么使用if条件判断 以下蓝色字体部分为Linux命令,红色字体的内容为输出的内容: # cd /opt/scripts ...
- shell编程学习笔记(六):cat命令的使用
这一篇不是讲shell编程的,专门讲cat命令.shell编程书用到了这个cat命令,顺便说一下cat命令. cat命令有多种用法,我一一来列举(以下蓝色字体部分为Linux命令,红色字体的内容为输出 ...
- shell编程学习笔记(五):Shell中脚本的参数
在执行Shell脚本的时候,可以在执行时带上参数,相当于传递参数给脚本,下面我们看一下怎么使用这个参数 以下蓝色字体部分为Linux命令,红色字体的内容为输出的内容: # cd /opt/script ...
- shell编程学习笔记之特殊变量($0、$1、$2、 $?、 $# 、$@、 $*)
特殊变量($0.$1.$2. $?. $# .$@. $*) shell编程中有一些特殊的变量可以使用.这些变量在脚本中可以作为全局变量来使用. 名称 说明 $0 脚本名称 $1-9 脚本执行时的参数 ...
- shell脚本学习笔记 (流编辑器sed)
sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用很普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出. sed不 ...
随机推荐
- Python目录整合
一.python基础篇 二.网络编程篇&&并发编程篇 三.数据库篇 -mysql -redis -mongodb 四.前端篇 -html -css -js jquery&&am ...
- mac配置python自然语言处理环境
一.nltk安装 Ⅰ.工具安装步骤 1.根据python版本从 https://pypi.python.org/pypi/setuptools 下载对应版本的setuptools.然后,在终端下运行, ...
- node.js---sails项目开发
http://sailsdoc.swift.ren/ 这里有 sails中文文档 node.js---sails项目开发(1)安装,启动sails node.js---sails项目开发(2)安装测试 ...
- Linux修改信息
修改时间 sudo date -s MM/DD/YY //修改日期 sudo date -s hh:mm:ss //修改时间 在修改时间以后,修改硬件CMOS的时间 sudo hwclock --sy ...
- Yii2 教程 - yii2-redis 扩展详解
该教程已被合并到<Yii2 权威指南中文版>中!Yiichina 教程地址为<yii2-redis 扩展详解>! 一.简介 yii2-redis 扩展为 Yii2 框架提供了 ...
- jmeter接口测试实战
请求方法:get/post 接口请求地址:http://172.22.24.26:8080/fundhouse/external/getdata?name=xxxx &fund_udid=35 ...
- 自定义admin管理工具(stark组件)
自定义admin管理工具(stark组件) 创建项目 了解了admin的功能后,我们可以开始仿照admin编写我们自己的管理工具stark组件 首先创建一个新的项目,并创建三个app stark就是我 ...
- SQL Server outer apply 和 cross apply
先说点题外话,因为后面我会用到这个函数. 前两天自定义了一个 sql 的字符串分割函数(Split),不过后来发现有点问题,例如: select * from Split(default,'123,4 ...
- 接口API中的敏感数据基于AES进行安全加密后返回
许久没有写博客了,有些惶恐地打开这个再熟悉不过的编辑器. 场景:要对一个涉及到敏感数据(账号.密码)的接口进行加密后返回 由于之前没有相关的经验,所以先在网上搜罗了一阵,这篇博客不错https://w ...
- 【Q2D】 2048设计
主要组件 1: GameDirector ,负责胜利.失败.载入上次成绩等 2: Grid, 表格类,负责管理tile二维数组 3: Tile 元素类,就是界面上移动的砖块了 4: InputHelp ...