转载:https://www.cnblogs.com/chensiqiqi/p/6382080.html

sed 介绍

  • Sed命令是操作,过滤和转换文本内容的强大工具。常用功能有增删改查(增加,删除,修改,查询),其中查询的功能中最常用的2大功能是过滤(过滤指定字符串),取行(取出指定行)
  • Sed软件从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行
  • 节省内存使用,快速处理文本文件

sed 命令选项

Sed软件有两个内置的存储空间:

  • 模式空间(pattern space):是sed软件从文本读取一行文本然后存入的缓冲区(这个缓冲区是在内存中的),然后使用sed命令操作模式空间的内容。
  • 保持空间(hold space):是sed软件另外一个缓冲区,用来存放临时数据,也是在内存中,但是模式空间和保持空间的用途是不一样的。Sed可以交换保持空间和模式空间的数据,但是不能在保持空间上执行普通的sed命令,也就是说我们可以在保持空间存储数据。

5,选项说明

option[选项] 解释说明(带*的为重点)
-n 取消默认的sed软件的输出,常与sed命令的p连用。*
-e 一行命令语句可以执行多条sed命令
-f 选项后面可以接sed脚本的文件名
-r 使用扩展正则表达式,默认情况sed只识别基本正则表达式*
-i 直接修改文件内容,而不是输出到终端,如果不使用-i选项sed软件只是修改在内存中的数据,并不会影响磁盘上的文件*
sed -commands[sed命令] 解释说明(带*的为重点)
a 追加,在指定行后添加一行或多行文本*
c 取代指定的行
d 删除指定的行*
D 删除模式空间的部分内容,直到遇到换行符\n结束操作,与多行模式相关
i 插入,在指定行前添加一行或多行文本*
h 把模式空间的内容复制到保持空间
H 把模式空间的内容追加到保持空间
g 把保持空间的内容复制到模式空间
G 把保持空间的内容追加到模式空间
x 交换模式空间和保持空间的内容
l 打印不可见的字符
n 清空模式空间的内容并读入下一行
N 不清空模式空间,并读取下一行数据并追加到模式空间*
p 打印模式空间内容,通常p会与选项-n一起使用*
P(大写) 打印模式空间的内容,直到遇到换行符\n结束操作
q 退出Sed
r 从指定文件读取数据
s 取代,s#old#new#g==>这里g是s命令的替代标志,注意和g命令区分。*
w 另存,把模式空间的内容保存到文件中
y 根据对应位置转换字符
:label 定义一个标签
b label 执行该标签后面的命令
t 如果前面的命令执行成功,那么就跳转到t指定的标签处,继续往下执行后续命令。否则,仍然继续正常的执行流程
特殊符号 解释说明(带*的为重点)
对指定行以外的所有行应用命令*
= 打印当前行行号
“First~step”表示从First行开始,以步长Step递增
& 代表被替换的内容
实现一行命令语句可以执行多条sed命令*
{} 对单个地址或地址范围执行批量操作
+

地址范围中用到的符号,做加法运算

第二章

实验样例

cat >>/test/files/person.txt<<KOF
101,zoulixiang,CEO
102,Alex,coo
103,yy,CFO
104,Tom,CIO
105,Jery,CTO
KOF

sed中到底使用单引号还是双引号?这里给大家详细说说引号的区别。

  1. 双引号:把双引号的内容输出出来;如果内容中有命令,变量等,会先把命令,变量解析出结果,然后再输出最终内容来。双引号内命令或变量的写法为`命令或变量`或$(命令或变量)
  2. 单引号:所见即所得,将单引号内的内容原样输出,阻止所有字符的转义
  3. 不加引号:不会将含有空格的字符串视为一个整体输出,如果内容中有命令,变量等,会先把命令,变量解析出结果,然后再输出最终内容来,如果字符串含有空格等特殊字符,则不能完整输出,则需改加双引号。
  4. 倒引号(反引号Esc键下方):进行命令的替换,在倒引号内部的shell命令将会被执行,其结果输出代替用倒引号括起来的文本。

实例1:

[root@harbor files]# sed '2a 106,dandan,CSO' person.txt
101,zoulixiang,CEO
102,Alex,coo
106,dandan,CSO
103,yy,CFO
104,Tom,CIO
105,Jery,CTO

命令解释:

2a :a为追加, 2代表第二行, 0,1,2 所有即在103上面。但不写入文件中(需要加其他参数)

[root@harbor files]# sed '2i $PATH' person.txt
101,zoulixiang,CEO
$PATH
102,Alex,coo
103,yy,CFO
104,Tom,CIO
105,Jery,CTO

命令解释:

' ' 单引号 : 原样输出

实例3:

[root@harbor files]# sed "2i $PATH" person.txt
101,zoulixiang,CEO
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
102,Alex,coo
103,yy,CFO
104,Tom,CIO
105,Jery,CTO
[root@harbor files]#

命令解释:

" "双引号:先将 $PATH(代表环境变量) 输出到屏幕中

实例4

[root@harbor files]# echo "zoulixiang";echo "zoulixinag"
zoulixiang
zoulixinag

;代表将两条命令换行

[root@harbor files]# echo -e "zoulixiang\nzoulixiang"
zoulixiang
zoulixiang
[root@harbor files]#

命令解释:

/n 为分隔符, 和;效果一样

e参数表示字符串中如果出现以下特殊字符(\n代表换行,\t代表Tab键等),则加以特殊处理,而不会将它当成一般文字输出。

实例5

[root@harbor files]# sed '2a 106,dandan,CSO\n107,bingbing,CCO' person.txt
101,zoulixiang,CEO
102,Alex,coo
106,dandan,CSO
107,bingbing,CCO
103,yy,CFO
104,Tom,CIO
105,Jery,CTO

效果同上

实例6

[root@harbor files]# echo \
> zoulixiang \
> is \
> me
zoulixiang is me
[root@harbor files]#

命令解释

这个符号可以将一条完整的命令分成多行,举个例子:

实例7

优化SSH配置(一键完成增加若干参数

Port 52113
PermitRootLogin no
PermitEmptyPasswords no
UseDNS no
GSSAPIAuthentication no

sed -i '13i Port 52113\nPermitRootLogin no\nPermitEmptyPasswords no\nUseDNS no\nGSSAPIAuthentication no' /etc/ssh/sshd_config

命令解释

13i 在13行前增加 这5行命令 ; sed 前面加i 直接对文件内容做出修改

实战8

[root@harbor files]# sed -n '15,17p' /etc/ssh/sshd_config
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
#Port 22
[root@harbor files]#

命令解释

查看文本内容, 选项-n 与命令p 的具体用法

实战9

[root@harbor files]# cat person.txt
101,zoulixiang,CEO
102,Alex,coo
106,dandan,CSO
107,bingbing,CCO
103,yy,CFO
104,Tom,CIO
105,Jery,CTO

[root@harbor files]# sed -i '1d' person.txt
[root@harbor files]# cat person.txt
102,Alex,coo
106,dandan,CSO
107,bingbing,CCO
103,yy,CFO
104,Tom,CIO
105,Jery,CTO
[root@harbor files]#

命令解释

-i 对文件内容修改, 1d: 代表删除第一行 d 代表delete 的意思

6.2.2.1指定执行的地址范围

sed软件可以对单行或多行文本进行处理。如果在sed命令前面不指定地址范围,那么默认会匹配所有行。
用法:n1[,n2]{sed -commands}
地址用逗号分隔开,n1,n2可以用数字,正则表达式,或者二者的组合表示。

地址范围 含义
10{sed-commands} 对第10行操作
10,20{sed-commands} 对10到20行操作,包括第10,20行
10,+20{sed-commands} 对10到30(10+20)行操作,包括第10,30行
1~2{sed-commands} 对1,3,5,7.....行操作
10,${sed-commands} 对10到最后一行($代表最后一行)操作,包括第10行
/chensiqi/{sed-commands} 对匹配chensiqi的行操作
/chensiqi/,/Alex/{sed-commands} 对匹配chensiqi的行到匹配Alex的行操作
/chensiqi/,${sed-commands} 对匹配chensiqi的行到最后一行操作
/chensiqi/,10{sed-commands} 对匹配chensiqi的行到第10行操作,注意:如果前10行没有匹配到chensiqi,sed软件会显示10行以后的匹配chensiqi的行
1,/Alex/{sed-commands} 对第1行到匹配Alex的行操作
/chensiqi/,+2{sed-commands}

对匹配chensiqi的行到其后的2行操作

第10章

实例1

[root@harbor files]# sed '2,5d' person.txt
102,Alex,coo

105,Jery,CTO

命令解释

删除第2行到第5行。

实例2

[root@harbor files]# sed '/yy/d' person.txt
102,Alex,coo
106,dandan,CSO
107,bingbing,CCO
104,Tom,CIO
105,Jery,CTO
[root@harbor files]#

命令解释:匹配 yy并且删除

实例3

[root@harbor files]# sed '/yy/,/Tom/d' person.txt
102,Alex,coo
106,dandan,CSO
107,bingbing,CCO
105,Jery,CTO
[root@harbor files]#

命令解释

匹配两个并且删除

实例4

[root@harbor files]# sed '4,$d' person.txt
102,Alex,coo
106,dandan,CSO
107,bingbing,CCO
[root@harbor files]#

命令解释

从第4行开始直到行尾都删除

实例4

[root@harbor files]# cat person.txt
102,Alex,coo
106,dandan,CSO
107,bingbing,CCO
103,yy,CFO
104,Tom,CIO
105,Jery,CTO
[root@harbor files]# sed '/Alex/,3d' person.txt
103,yy,CFO
104,Tom,CIO
105,Jery,CTO
[root@harbor files]#

命令解释

匹配Alex 以下三行都删除

实例5

[root@harbor files]# sed '$a 109,test,COF' person.txt
102,Alex,coo
106,dandan,CSO
107,bingbing,CCO
103,yy,CFO
104,Tom,CIO
105,Jery,CTO
108,qiqi,CFF
101,qiqi1,CFO
109,test,COF
[root@harbor files]#

命令解释:

$a 行尾追加的意思

[root@harbor files]# sed '$a 109,test,COF' person.txt |sed '/yy/,3d'
102,Alex,coo
106,dandan,CSO
107,bingbing,CCO
104,Tom,CIO
105,Jery,CTO
108,qiqi,CFF
101,qiqi1,CFO
109,test,COF
[root@harbor files]# sed '$a 109,test,COF' person.txt |sed '/yy/,$d'
102,Alex,coo
106,dandan,CSO
107,bingbing,CCO
[root@harbor files]#

命令解释

$a 行尾追加, 匹配yy 删除以下3行

$a 行尾追加, 匹配yy 删除以下行尾

第11章

例子:

  • 1~2 匹配1,3,5,7.....#-->用于只输出奇书行,大伙仔细观察一下每个数字的差值。
  • 2~2 匹配2,4,6,8....#-->用于只输出偶数行
  • 1~3 匹配1,4,7,10.....
  • 2~3 匹配2,5,8,11.....
[root@chensiqi1 ~]# seq 10
1
2
3
4
5
6
7
8
9
10 命令说明:seq命令能够生成从1到10的数字序列。 [root@chensiqi1 ~]# seq 10 | sed -n '1~2p'
1
3
5
7
9 命令说明:
上面的命令主要验证特殊符号“~”的效果,其他sed命令用法n和p请见后文详解,大家只需要知道这个命令可以将“1~2”指定的行显示出来即可。
上面例子测试了“1~2”的效果,大家也可以手动测试一下“2~2”,“1~3”,“2~3”,看一下他们的结果是不是符合等差数列。
[root@chensiqi1 ~]# seq 1 2 10
1
3
5
7
9 命令说明:seq命令格式seq起始值 公差 结束值 [root@chensiqi1 ~]# sed '1~2d' person.txt
102,zhangyang,CTO
104,yy,CFO 命令说明:“1~2”这是指定行数的另一种格式,从第1行开始以步长2递增的行(1,3,5),因此删掉第1,3,5行,即所有的奇数行。 [root@chensiqi1 ~]# sed '1,+2d' person.txt 
104,yy,CFO
105,feixue,CIO 命令说明:这其实是做个加法运算,‘1,+2d’==>删除第1行到第3(1+2)行的文本。 从第1行开始删除+2d 知道第2行(0,1,2) 实例3
[root@harbor files]# sed '2,3!d' person.txt
106,dandan,CSO
107,bingbing,CCO 命令解释
从第2行开始保留到第3行, ! 代表取反的意思, 保留 实例4
打印文件内容但不包含yy
[root@harbor files]# sed '/yy/d' person.txt
102,Alex,coo
106,dandan,CSO
107,bingbing,CCO
104,Tom,CIO
105,Jery,CTO
108,qiqi,CFF
101,qiqi1,CFO 命令说明:删除包含“yy”的行,就直接用正则匹配字符串yy即可 第12章
sed 替换
首先说一下按行替换,这个功能用的很少,所以大家了解即可。这里用到的sed命令是:
“c”:用新行取代旧行,记忆方法:c的全拼是change,意思是替换。 实例1
[root@harbor files]# sed '1c 106,zoulixiang,coo' person.txt
106,zoulixiang,coo
106,dandan,CSO
107,bingbing,CCO
103,yy,CFO
104,Tom,CIO
105,Jery,CTO
108,qiqi,CFF
101,qiqi1,CFO 命令解释
1c 代表替换第一行
文本替换
  • 接下来说的这个功能,有工作经验的同学应该非常的熟悉,因为使用sed软件80%的场景就是使用替换功能。
  • 这里用到的sed命令,选项:
    “s”:单独使用-->将每一行中第一处匹配的字符串进行替换==>sed命令
    “g”:每一行进行全部替换-->sed命令s的替换标志之一(全局替换),非sed命令。
    “-i”:修改文件内容-->sed软件的选项,注意和sed命令i区别。

sed软件替换模型

sed -i 's/目标内容/替换内容/g' chensiqi.log
sed -i 's#目标内容#替换内容#g'

观察特点

1,两边是引号,引号里面的两边分别为s和g,中间是三个一样的字符/或#作为定界符。字符#能在替换内容包含字符/有助于区别。定界符可以是任意字符如:或|等,但当替换内容包含定界符时,需要转义:或|.经过长期实践,建议大家使用#作为定界符。
2,定界符/或#,第一个和第二个之间的就是被替换的内容,第二个和第三个之间的就是替换后的内容。
3,s#目标内容#替换内容#g ,“目标内容”能用正则表达式,但替换内容不能用,必须是具体的。因为替换内容使用正则的话会让sed软件无所适从,它不知道你要替换什么内容。
4,默认sed软件是对模式空间(内存中的数据)操作,而-i选项会更改磁盘上的文件内容。

实例1
[root@harbor files]# sed 's#yy#cc#g' person.txt
102,Alex,coo
106,dandan,CSO
107,bingbing,CCO
103,cc,CFO
104,Tom,CIO
105,Jery,CTO
108,qiqi,CFF
101,qiqi1,CFO
[root@harbor files]# 命令解释
直接将yy替换成了cc 实例2
[root@chensiqi1 ~]# sed '3s#0#9#' person.txt
101,chensiqi,CEO
102,zhangyang,CTO
193,Alex,COO
104,yy,CFO
105,feixue,CIO 命令说明:
    前面学习的例子在sed命令“s”前没有指定地址范围,因此默认是对所有行进行操作。
    而这个案例要求只将第3行的0换成9,这里就用到了我们前面学过的地址范围知识,在sed命令“s”前加上“3”就代表对第3行进行替换 #直接将第三行的0替换成了9 实例3 变量替换
[root@harbor files]# cat > test.txt <<EOF
> a
> b
> a
> EOF
[root@harbor files]# cat test.txt
a
b
a
[root@harbor files]# [root@harbor files]# x=a
[root@harbor files]# y=b
[root@harbor files]# echo $x
a
[root@harbor files]# echo $x $y
a b
[root@harbor files]# [root@harbor files]# sed s#$x#$y#g test.txt
b
b
b 命令解释
将变量x=a 替换成了 $y=b 最终输出的都是 y=b 实例4

使用eval命令:

# eval sed 's#$x#$y#g' test.txt
b
b
b 命令说明:这里给大家扩展一个Linux内置命令eval,这个命令能读入变量,并将他们组合成一个新的命令,然后执行。首先eval会解析变量$x和变量$y,最后达到的效果和双引号是一样的。

扩展:最快速的获取IP地址的方法

[root@harbor files]# hostname -I |awk '{print $2}'
192.168.1.195 命令解释
直接获取IP
6.2.3.4 分组替换()和\1的使用说明

sed软件的()的功能可以记住正则表达式的一部分,其中,\1为第一个记住的模式即第一个小括号中的匹配内容,\2第二个记住的模式,即第二个小括号中的匹配内容,sed最多可以记住9个。

例:echo "I am chensiqi teacher."如果想保留这一行的单词chensiqi,删除剩下部分,使用圆括号标记想保留的部分。

[root@chensiqi1 ~]# echo "I am chensiqi teacher." | sed 's#^.*am \([a-z]\+\) tea.*$#\1#g'
chensiqi [root@chensiqi1 ~]# echo "I am chensiqi teacher." | sed -r 's#^.*am ([a-z]+) tea.*$#\1#g'
chensiqi [root@chensiqi1 ~]# echo "I am chensiqi teacher." | sed -r 's#I (.*) (.*) teacher.#\1\2#g'
amchensiqi 命令说明:
sed如果不加-r后缀,那么默认不支持扩展正则表达式,需要\符号进行转义。小括号的作用是将括号里的匹配内容进行分组以便在第2和第3个#号之间进行sed的反向引用,\1代表引用第一组,\2代表引用第二组
实例1
[root@harbor files]# ip addr |sed -n  '9p' |sed -r 's#inet (.*) brd.*$#\1#g'
    192.168.2.198/24
[root@harbor files]# ip addr |sed -n  '9p' |sed -r 's#inet (.*) brd.*$#\1#g' |awk -F"/"  '{print $1}'
    192.168.2.198

再来看个题目:请执行命令取出linux中的eth0的IP地址?

[root@chensiqi1 ~]# ifconfig eth0 | sed -n '2p'
inet addr:192.168.197.133 Bcast:192.168.197.255 Mask:255.255.255.0
[root@chensiqi1 ~]# ifconfig eth0 | sed -n '2p' | sed -r 's#^.*addr:(.*) Bcast:.*$#\1#g'
192.168.197.133 也可以进行组合 [root@chensiqi1 ~]# ifconfig eth0 | sed -rn '2s#^.*addr:(.*) Bcast:.*$#\1#gp'
192.168.197.133 命令说明:
这道题是需要把ifconfig eth0执行结果的第2行的IP地址取出来,上面答案的思路是用IP地址来替换第2行的内容。

企业案例4:系统开机启动项优化(利用sed)

[root@chensiqi1 ~]# chkconfig --list | egrep -v  "sshd|crond|rsyslog|sysstat|network" | awk '{print $1}' |sed -r 's#^(.*)#chkconfig \1 off#g' |bash

这题也可以应用awk直接一步到位
[root@chensiqi1 ~]# chkconfig --list | egrep -v "sshd|crond|network|rsyslog|sysstat" | awk '{print "chkconfig",$1,"off"}' | bash
[root@harbor files]# sed -r 's#(.*),(.*),(.*)#& --- \1 \2 \3#' person.txt
102,Alex,coo --- 102 Alex coo
106,dandan,CSO --- 106 dandan CSO
107,bingbing,CCO --- 107 bingbing CCO
103,yy,CFO --- 103 yy CFO
104,Tom,CIO --- 104 Tom CIO
105,Jery,CTO --- 105 Jery CTO
108,qiqi,CFF --- 108 qiqi CFF
101,qiqi1,CFO --- 101 qiqi1 CFO
[root@harbor files]# sed -r 's#(.*),(.*),(.*)# \1 \2 \3#' person.txt
 102 Alex coo
 106 dandan CSO
 107 bingbing CCO
 103 yy CFO
 104 Tom CIO
 105 Jery CTO
 108 qiqi CFF
 101 qiqi1 CFO 命令说明:
    1,这里将分组替换和&符号放在一起对比
    2,命令中的分组替换使用了3个小括号,每个小括号分别代表每一行以逗号作为分隔符的每一列。
    3,上面命令的&符号代表每一行,即模型中‘s#目标内容#替换内容#g’的目标内容。 实例1
[root@harbor files]# for i in {1..5};do echo  "<h3>test<h3>" > stu_102999_$i\_\fin.jpg; done
创建测试文件

实例2

批量重命名

[root@harbor files]# find ./ -name "*_fin.jpg" |sed -r 's#^(.*)_fin(.*)#\1\2#g'
./stu_10299_i.jpg
./.jpg
./stu_102999_1.jpg
./stu_102999_2.jpg
./stu_102999_3.jpg
./stu_102999_4.jpg
./stu_102999_5.jpg
[root@harbor files]# find ./ -name "*_fin.jpg" |sed -r 's#^(.*)_fin(.*)#& \1\2#g'
./stu_10299_i_fin.jpg ./stu_10299_i.jpg
./_fin.jpg ./.jpg
./stu_102999_1_fin.jpg ./stu_102999_1.jpg
./stu_102999_2_fin.jpg ./stu_102999_2.jpg
./stu_102999_3_fin.jpg ./stu_102999_3.jpg
./stu_102999_4_fin.jpg ./stu_102999_4.jpg
./stu_102999_5_fin.jpg ./stu_102999_5.jpg
[root@harbor files]# ffind ./ -name "*_fin.jpg" |sed -r 's#^(.*)_fin(.*)#mv & \1\2#g'
-bash: ffind: command not found
[root@harbor files]# find ./ -name "*_fin.jpg" |sed -r 's#^(.*)_fin(.*)#mv & \1\2#g'
mv ./stu_10299_i_fin.jpg ./stu_10299_i.jpg
mv ./_fin.jpg ./.jpg
mv ./stu_102999_1_fin.jpg ./stu_102999_1.jpg
mv ./stu_102999_2_fin.jpg ./stu_102999_2.jpg
mv ./stu_102999_3_fin.jpg ./stu_102999_3.jpg
mv ./stu_102999_4_fin.jpg ./stu_102999_4.jpg
mv ./stu_102999_5_fin.jpg ./stu_102999_5.jpg
[root@harbor files]# ls
awkfile.txt  file3.txt  ip.txt      stu_102999_.          stu_102999_3_fin.jpg  stu_10299_i_fin.jpg
count.txt    file.txt   person.txt  stu_102999_1_fin.jpg  stu_102999_4_fin.jpg  stu_10299_.jpg
file2.txt    _fin.jpg   reg.txt     stu_102999_2_fin.jpg  stu_102999_5_fin.jpg  test.txt
[root@harbor files]# find ./ -name "*_fin.jpg" |sed -r 's#^(.*)_fin(.*)#mv & \1\2#g'
mv ./stu_10299_i_fin.jpg ./stu_10299_i.jpg
mv ./_fin.jpg ./.jpg
mv ./stu_102999_1_fin.jpg ./stu_102999_1.jpg
mv ./stu_102999_2_fin.jpg ./stu_102999_2.jpg
mv ./stu_102999_3_fin.jpg ./stu_102999_3.jpg
mv ./stu_102999_4_fin.jpg ./stu_102999_4.jpg
mv ./stu_102999_5_fin.jpg ./stu_102999_5.jpg
[root@harbor files]# find ./ -name "*_fin.jpg" |sed -r 's#^(.*)_fin(.*)#mv & \1\2#g' |bash
[root@harbor files]# ls
awkfile.txt  file2.txt  file.txt  person.txt  stu_102999_.      stu_102999_2.jpg  stu_102999_4.jpg  stu_10299_i.jpg  test.txt
count.txt    file3.txt  ip.txt    reg.txt     stu_102999_1.jpg  stu_102999_3.jpg  stu_102999_5.jpg  stu_10299_.jpg

命令说明:
1.“\1”代表前面“(^.*)”匹配内容,“&”代表“s# #”里被替换的内容,这里匹配到的是完整的文件名。
2.使用bash命令执行,bash命令执行标准输入的语句,如同我们在命令行输入语句后敲回车。

第13章

6.2.4.1 按行查询
[root@chensiqi1 ~]# sed '2p' person.txt
101,chensiqi,CEO
102,zhangyang,CTO
102,zhangyang,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@chensiqi1 ~]# sed -n '2p' person.txt
102,zhangyang,CTO 命令说明:选项-n取消默认输出,只输出匹配的文本,大家只需要记住使用命令p必用选项-n。 [root@chensiqi1 ~]# sed -n '2,3p' person.txt
102,zhangyang,CTO
103,Alex,COO 命令说明:查看文件的第2行到3行,使用地址范围“2,3”。取行就用sed,最简单 [root@chensiqi1 ~]# sed -n '1~2p' person.txt
101,chensiqi,CEO
103,Alex,COO
105,feixue,CIO 命令说明:打印文件的1,3,5行。~代表步长 [root@chensiqi1 ~]# sed -n 'p' person.txt
101,chensiqi,CEO
102,zhangyang,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO 命令说明:不指定地址范围,默认打印全部内容。

按字符串查询

[root@harbor files]# sed -n '/CTO/p' person.txt
105,Jery,CTO
[root@harbor files]# sed -n '/CTO/,/CFO/p' person.txt
105,Jery,CTO
108,qiqi,CFF
101,qiqi1,CFO
[root@harbor files]#

6.2.4.3 混合查询
[root@chensiqi1 ~]# sed -n '2,/CFO/p' person.txt
102,zhangyang,CTO
103,Alex,COO
104,yy,CFO 命令说明:打印第2行到含CFO的行。 [root@chensiqi1 ~]# sed -n '/feixue/,2p' person.txt
105,feixue,CIO 命令说明:特殊情况,前两行没有匹配到feixue,就向后匹配,如果匹配到feixue就打印此行。所以这种混合地址不推荐使用。
6.2.4.4 过滤多个字符
[root@chensiqi1 ~]# sed -rn '/chensiqi|yy/p' person.txt
101,chensiqi,CEO
104,yy,CFO 命令说明:
使用扩展正则“|”,为了不使用转义符号“\”,因此使用-r选项开启扩展正则表达式模式

7,sed命令应用知识扩展

7.1 sed修改文件的同时进行备份

[root@chensiqi1 ~]# cat person.txt
101,chensiqi,CEO
102,zhangyang,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@chensiqi1 ~]# sed -i.bak 's#zhangyang#NB#g' person.txt
[root@chensiqi1 ~]# cat person.txt
101,chensiqi,CEO
102,NB,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@chensiqi1 ~]# cat person.txt.bak
101,chensiqi,CEO
102,zhangyang,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO 命令行说明:
在-i参数的后边加上.bak(.任意字符),sed会对文件进行先备份后修改

7.1 sed修改文件的同时进行备份

[root@chensiqi1 ~]# cat person.txt
101,chensiqi,CEO
102,zhangyang,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@chensiqi1 ~]# sed -i.bak 's#zhangyang#NB#g' person.txt
[root@chensiqi1 ~]# cat person.txt
101,chensiqi,CEO
102,NB,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@chensiqi1 ~]# cat person.txt.bak
101,chensiqi,CEO
102,zhangyang,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO 命令行说明:
在-i参数的后边加上.bak(.任意字符),sed会对文件进行先备份后修改

7.2 特殊符号=获取行号

[root@chensiqi1 ~]# sed '=' person.txt
1
101,chensiqi,CEO
2
102,NB,CTO
3
103,Alex,COO
4
104,yy,CFO
5
105,feixue,CIO 命令说明:使用特殊符号“=”就可以获取文件的行号,这是特殊用法,记住即可。从上面的命令结果我们也发现了一个不好的地方:行号和行不在一行。 [root@chensiqi1 ~]# sed '1,3=' person.txt
1
101,chensiqi,CEO
2
102,NB,CTO
3
103,Alex,COO
104,yy,CFO
105,feixue,CIO 命令说明:只打印1,2,3行的行号,同时打印输出文件中的内容 [root@chensiqi1 ~]# sed '/yy/=' person.txt
101,chensiqi,CEO
102,NB,CTO
103,Alex,COO
4
104,yy,CFO
105,feixue,CIO 命令说明:
只打印正则匹配行的行号,同时输出文件中的内容 [root@chensiqi1 ~]# sed -n '/yy/=' person.txt
4 命令说明:只显示行号但不显示行的内容即取消默认输出。 [root@chensiqi1 ~]# sed -n '$=' person.txt
5 命令说明:
“$”代表最后一行,因此显示最后一行的行号,变相得出文件的总行数。

方法改进:

[root@chensiqi1 ~]# sed '=' person.txt | sed 'N;s#\n# #'
1 101,chensiqi,CEO
2 102,NB,CTO
3 103,Alex,COO
4 104,yy,CFO
5 105,feixue,CIO 命令说明:前面sed获取文件的行号有一个缺点,我们这里使用Sed命令N来补偿这个缺点。Sed命令N读取下一行数据并附加到模式空间。

7.3 sed如何取不连续的行

[root@chensiqi1 ~]# sed -n '1p;3p;5p' person.txt
101,chensiqi,CEO
103,Alex,COO
105,feixue,CIO

7.4 特殊符号{}的使用

[root@chensiqi1 ~]# sed -n '2,4p;=' person.txt
1
102,NB,CTO
2
103,Alex,COO
3
104,yy,CFO
4
5 命令说明:-n去掉默认输出,2,4p,输出2到4行内容,=输出全部的行的行号 [root@chensiqi1 ~]# sed -n '2,4{p;=}' person.txt
102,NB,CTO
2
103,Alex,COO
3
104,yy,CFO
4 命令说明:
‘2,4{p;=}’代表统一输出2,4行的行号和内容

												

linux之 sed 基础的更多相关文章

  1. linux之sed基础命令详解

    sed (Stream  EDitor)是一个强大的字符流编辑器,输入一般是来自文件,默认情况下不编辑原文件,仅对模式空间中的数据作处理;而后,将模式空间打印到屏幕显示 sed基础用法 sed [op ...

  2. Linux中sed基础

    sed是一种流编辑器,它是文本处理中非常重要的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern spac ...

  3. linux 脚本编写基础(一)

    1. Linux 脚本编写基础 1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在 ...

  4. Linux shell入门基础(六)

    六.Shell脚本编程详解 将上述五部分的内容,串联起来,增加对Shell的了解 01.shell脚本 shell: # #perl #python #php #jsp 不同的脚本执行不同的文本,执行 ...

  5. 鸟哥Linux私房菜基础学习篇学习笔记3

    鸟哥Linux私房菜基础学习篇学习笔记3 第十二章 正则表达式与文件格式化处理: 正则表达式(Regular Expression) 是通过一些特殊字符的排列,用以查找.删除.替换一行或多行文字字符: ...

  6. Linux中sed的用法实践

    Linux中sed的用法实践 参考资料:https://www.cnblogs.com/emanlee/archive/2013/09/07/3307642.html http://www.fn139 ...

  7. Linux中Sed的用法

    Linux中Sed的用法 sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为: ...

  8. 第一阶段·Linux运维基础-第1章·Linux基础及入门介绍

    01-课程介绍-学习流程 02-服务器硬件-详解 03-服务器核心硬件-服务器型号-电源-CPU 01-课程介绍-学习流程 1.1. 光看不练,等于白干: 1.2 不看光练,思想怠慢: 1.3 即看又 ...

  9. 【转载】linux之sed用法

    linux之sed用法 原文地址:http://www.cnblogs.com/dong008259/archive/2011/12/07/2279897.html   sed是一个很好的文件处理工具 ...

随机推荐

  1. Linux 文本处理命令

    最近在使用 BASH 进行处理 文本文件的时候,对于文本处理真的是力不从心,今天进行搜集一下linux 中文本处理相关的命令,这样你在进行书写shell 脚本的时候,就能写出更好的方案. 命令搜集: ...

  2. python基础学习15----异常处理

    异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件). 1.异常的类型 异常的类型多种多样,常见的异常有: AttributeE ...

  3. leetcode 121 买卖股票的最佳时机

    题目 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股票. ...

  4. 027.1 反射技术 Class

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...

  5. pytorch GPU的程序kill后未释放内存

    使用PyTorch设置多线程(threads)进行数据读取(DataLoader),其实是假的多线程,他是开了N个子进程(PID都连着)进行模拟多线程工作,所以你的程序跑完或者中途kill掉主进程的话 ...

  6. 编译有哪些阶段,动态链接和静态链接的区别 c++

    预处理—->编译—->汇编—->链接 预处理:编译器将C程序的头文件编译进来,还有宏的替换 编译:这个阶段编译器主要做词法分析.语法分析.语义分析等,在检查无错误后后,把代码翻译成汇 ...

  7. Nginx端口占用问题

    错误信息:nginx: [emerg] listen() to 0.0.0.0:80, backlog 511 failed (98: Address already in use) 主要是端口被占用 ...

  8. openJDK环境搭建编译(fedora)

    1.安装VMware  VMware-workstation-full-10.0.7-2844087.exe    破解码:HY06L-F334P-9Z6H9-6R2XM-23C6J  安装完成之后, ...

  9. AMD、CMD和Common规范

    1.名词解释AMD:Asynchronous Modules Definition异步模块定义,提供定义模块及异步加载该模块依赖的机制.CMD:Common Module Definition 通用模 ...

  10. kubernetes 资源请求和限制

    1. spec:      containers:        - name: example          resources:            requests:            ...