一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 5162|回复: 5

linux之sed用法

[复制链接]
发表于 2017-3-25 09:05 | 显示全部楼层 |阅读模式
sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下sed的用法) r7 u; S3 w. y8 x: d* r
sed命令行格式为:
$ U. |: T6 N$ u& O' B$ e$ ?, f         sed [-nefri] ‘command’ 输入文本        
常用选项:/ R+ V& U; V! u+ Q4 W  R
        -n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。6 q/ O; @5 h  F
        -e∶直接在指令列模式上进行 sed 的动作编辑;
0 L2 h% Y9 F5 r+ F" G7 _        -f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;% ]  P( h- e/ t' g: \, r9 {* [* `
        -r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
- D/ i0 H  ?' ]: `9 Y        -i∶直接修改读取的档案内容,而不是由萤幕输出。      
常用命令:
/ F* S; }+ H3 T2 V* C9 [; v# F        a   ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
- d& U: w7 `1 Y  h        c   ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!' q4 Y2 S3 t& U" j; b
        d   ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;  H0 s: g% ?# @5 ^! q, ]
         i   ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
" v0 z/ C. f- U2 T3 z& P3 ~4 m         p  ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
2 [& P# B4 {2 j) n5 U         s  ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
举例:(假设我们有一文件名为ab)
* Q! b! m: z  F: A+ H9 U' Y' A     删除某行
3 g0 ~/ V1 }# N) k5 N9 a# j     [root@localhost ruby] # sed '1d' ab              #删除第一行   E; L7 ?8 W: N
     [root@localhost ruby] # sed '$d' ab              #删除最后一行
, e2 `( ]# t/ \/ q+ W7 S- q     [root@localhost ruby] # sed '1,2d' ab           #删除第一行到第二行% G6 G4 J5 g+ d3 `1 }$ D8 M* ^" c: U
     [root@localhost ruby] # sed '2,$d' ab           #删除第二行到最后一行
  显示某行
# i# |4 e( u8 b/ o.    [root@localhost ruby] # sed -n '1p' ab           #显示第一行
! Y2 |& |1 Y% r/ {4 h" H% _, e     [root@localhost ruby] # sed -n '$p' ab           #显示最后一行
, _6 r# E4 s/ Q. k, ?7 ^     [root@localhost ruby] # sed -n '1,2p' ab        #显示第一行到第二行* _* i! }  O# t
     [root@localhost ruby] # sed -n '2,$p' ab        #显示第二行到最后一行
  使用模式进行查询* d) k5 L$ x1 d" L5 A
     [root@localhost ruby] # sed -n '/ruby/p' ab    #查询包括关键字ruby所在所有行
' [9 `0 S1 ^8 I6 h     [root@localhost ruby] # sed -n '/\$/p' ab        #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义
  增加一行或多行字符串
! U; H% D$ f) U; G% n8 K, O; x     [root@localhost ruby]# cat ab
; w: `" R6 M. B! }' I     Hello!
: ~, p1 n$ C; \% X8 D     ruby is me,welcome to my blog./ N) k' r& @5 o9 {
     end
: {( v% V  `& k; V1 ]     [root@localhost ruby] # sed '1a drink tea' ab  #第一行后增加字符串"drink tea"
+ {( n% i( H! [. ~% s! Q4 W* r     Hello!
$ f& ^3 K: E8 ^; D! w     drink tea' r8 H! u* Q& R7 `" ]8 m! R
     ruby is me,welcome to my blog. 1 n; U; [+ V& u5 f: t
     end7 `. a+ z9 Q9 S' x; p% [# d9 l
     [root@localhost ruby] # sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea"
! j% H* J5 B: f# k6 S     Hello!
! w, G/ C& ~3 @$ M4 V; M1 D  G: w     drink tea% D# h4 d: d% t# A
     ruby is me,welcome to my blog., c- n6 h& n9 a5 C* p9 d+ ~  Y
     drink tea+ p; o8 K( H6 O3 ?9 m; u
     end) i6 D+ M% M% k, U/ }" h& z
     drink tea
& I) Z, ^8 f2 H     [root@localhost ruby] # sed '1a drink tea\nor coffee' ab   #第一行后增加多行,使用换行符\n9 T6 s- [, _1 K$ `9 H: g) S: C
     Hello!
, j/ r  C/ I+ S3 K     drink tea
9 [' f5 u, z; S( N  l2 r1 v8 w0 c+ }     or coffee
+ f9 w% X- |# r- P/ v     ruby is me,welcome to my blog.% W. ]$ c. Z/ N7 M9 A
     end
  代替一行或多行& ]( a" Y2 `* Y; a" I; c9 _
     [root@localhost ruby] # sed '1c Hi' ab                #第一行代替为Hi
+ c) l+ a2 c4 s     Hi
( s/ n; Q" y- V+ F. f" }     ruby is me,welcome to my blog.
8 d$ y+ r3 E+ o" V  f" Z1 I     end3 |* o( p# o& l8 w( C
     [root@localhost ruby] # sed '1,2c Hi' ab             #第一行到第二行代替为Hi6 K* x3 Z# s  k7 F
     Hi
7 J: @( U( m6 F; D: {( g     end
  替换一行中的某部分
3 E1 k% |! ?2 M7 F9 o  格式:sed 's/要替换的字符串/新的字符串/g'   (要替换的字符串可以用正则表达式)1 l, _4 b) m* T8 x) ~4 f3 f# ]
     [root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby/bird/g'    #替换ruby为bird
3 K* h" K( B) T9 {   [root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby//g'        #删除ruby
     插入' w; {! l6 q8 {, K; a2 Z
     [root@localhost ruby] # sed -i '$a bye' ab         #在文件ab中最后一行直接输入"bye"
0 J2 j( {. r9 R3 J3 X9 N* r     [root@localhost ruby]# cat ab. u: }+ y9 {$ G1 ~
     Hello!% d: ^: ?; @' f4 Z
     ruby is me,welcome to my blog.
$ f# [' |7 ^. ]% {  C( ]# l+ b     end+ P3 {' G7 X# X8 v3 B  v* d& C
     bye
     删除匹配行
      sed -i '/匹配字符串/d'  filename  (注:若匹配字符串是变量,则需要“”,而不是‘’。记得好像是)
      替换匹配行中的某个字符串
      sed -i '/匹配字符串/s/替换源字符串/替换目标字符串/g' filename
" e4 W. D/ Y5 U( ~' o3 e

* \) r/ N" [3 x$ W. \+ T% H6 O+ l; ^/ ?0 t9 k+ @/ b0 q

# _- s( Q  R5 U
. N+ ?# k. w+ K6 Z8 \
发表于 2017-3-25 10:09 | 显示全部楼层
sed+awk只是听说过是神器,一直没机会学习,跟着楼主学起来。谢谢楼主~~~
回复

使用道具 举报

 楼主| 发表于 2017-3-25 10:14 | 显示全部楼层
zhixiaoyuhong 发表于 2017-3-25 10:09; E2 V( m1 P3 v: J, L% a
sed+awk只是听说过是神器,一直没机会学习,跟着楼主学起来。谢谢楼主~~~

' x; P& |" V  G: A" s& `9 a7 R客气了,大家一起来学
回复

使用道具 举报

 楼主| 发表于 2017-4-13 11:51 | 显示全部楼层
linux sed命令详解
# e5 j3 ?& C) {9 c+ G! Y简介
! S" \& C+ T* `+ i" ^% |) p' Dsed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
$ K1 A) S! K: e5 q0 g5 }
  h. V- ~# N4 n  C3 M
, D7 d6 g2 d: J) Z' y8 L9 c/ I
! C" q4 `2 A3 w5 qsed使用参数, ~# k& r; S7 @# x
复制代码
' }- m1 u. x1 J) V$ d7 {% m! [1 s5 G2 Z[root@www ~]# sed [-nefr] [动作]  \! S% F% O9 b; t7 i6 N$ x
选项与参数:3 S- j" D  N  F5 w
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
0 s5 a/ C3 n" {0 H1 N; u+ Y1 s+ x-e :直接在命令列模式上进行 sed 的动作编辑;8 R! c2 g2 E: V0 g
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;& ~- j+ ]0 x  B0 H
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
! E* M3 c; N, ^& W-i :直接修改读取的文件内容,而不是输出到终端。/ ?5 [! \. ?  g( s6 s  d$ U

8 ^5 }' z  d) Y0 X; ^" C, F动作说明: [n1[,n2]]function; X4 U, Z3 Y" W: V+ T5 Y
n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』
- U( v1 E* O% G% \; }! i6 P3 R! M/ M7 T" Y1 ?
function:0 Q* s9 g, U3 m+ w
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~+ M  f7 G6 d( S  Y% Q2 }
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
; X6 A, g* e# o5 cd :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;; g8 a1 Q( g: T9 H. A/ i- X  B1 L; q
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);4 `: l# a5 C( ?4 L7 b  Y3 I
p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~2 [6 T" M* N0 ~' {% }$ Q! }+ u7 Q
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
* K( C4 J. b% s复制代码
( k# ?/ A2 r% ]* \  x: H) b : d, [4 M1 n6 s$ B# f3 P
+ v- G% G6 K& d& ?7 O; m) R
以行为单位的新增/删除
" t( V# g, {0 E+ e( }+ R- x4 ^: _4 u# m! u
将 /etc/passwd 的内容列出并且列印行号,同时,请将第 2~5 行删除!
8 i" ?7 [3 `) Y3 ~& r9 [
9 U( p* J! e9 C3 H* P3 G2 c* \[root@www ~]# nl /etc/passwd | sed '2,5d'7 j- S1 E! K! ~1 h8 L6 D5 d* M
1 root:x:0:0:root:/root:/bin/bash+ C: W8 M$ o, Q, P
6 sync:x:5:0:sync:/sbin:/bin/sync+ H% t7 |: S3 T0 U5 _6 v7 X
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
$ i2 ~6 u1 n* v.....(后面省略).....
; N' P$ V! Q7 W$ _( f& ?0 J/ w: q
sed 的动作为 '2,5d' ,那个 d 就是删除!因为 2-5 行给他删除了,所以显示的数据就没有 2-5 行罗~ 另外,注意一下,原本应该是要下达 sed -e 才对,没有 -e 也行啦!同时也要注意的是, sed 后面接的动作,请务必以 '' 两个单引号括住喔!) E% M% X5 L4 p/ X& X1 B
% Z" S- r5 L% s2 y1 r5 f- _1 Y
只要删除第 2 行
' Y+ B# G. [# v; Z( ]* y  I. W$ o- v$ ~$ L
nl /etc/passwd | sed '2d'
, n3 i  [8 e* j9 p, \5 p% ^' a
7 K, N' Q1 g5 F$ j6 u, y2 {( i6 Y" ?
要删除第 3 到最后一行. k5 k7 u% Z+ D/ K! m8 J+ Y" t
1 D+ c* _9 \- k& d
nl /etc/passwd | sed '3,$d' / I  x" V$ |$ x- Q

4 F% a; I9 ~$ z4 y1 k4 J
; F& l8 e4 u# j3 E$ G在第二行后(亦即是加在第三行)加上『drink tea?』字样!
0 _6 [3 M7 q% e# K& R) ], e7 V/ P* C8 w' m
[root@www ~]# nl /etc/passwd | sed '2a drink tea'
- i6 D# F! Q- r2 x1 root:x:0:0:root:/root:/bin/bash
8 g$ ?" O; ~, j) L6 J4 |2 bin:x:1:1:bin:/bin:/sbin/nologin
/ b7 {0 s, F/ I( k. ndrink tea6 ~; o, W6 D! f" V- X$ B
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin% s- O# ~! t" Z/ U* D$ K) v
.....(后面省略).....
1 I$ l; @9 O, ]' D) U( x; B2 Z
/ H5 p9 c, u4 v& }% B% @; T3 _8 c; C0 e3 G* ]  p) O: e' W6 r' v
那如果是要在第二行前, J0 p9 X9 I9 B' _, r. y! k

1 I3 }4 t% F: E2 I nl /etc/passwd | sed '2i drink tea' 9 m" k  @# Q/ Z3 L$ T
1 {5 M% w( ~  o/ l9 ^

9 i) F6 K9 n0 }# ~0 z6 l7 a如果是要增加两行以上,在第二行后面加入两行字,例如『Drink tea or .....』与『drink beer?』- }) s, b4 l2 x5 i% o( C

# C$ |! U) H) X2 L# {2 \复制代码, C% I6 L: w, @# Q  _, L7 G2 H
[root@www ~]# nl /etc/passwd | sed '2a Drink tea or ......\
# v5 S( ~  |: v4 x4 Q+ ^> drink beer ?'
/ p4 P. J, A/ Z; d1 root:x:0:0:root:/root:/bin/bash
1 U* f' ]0 E* `3 ]! [: I4 [" q2 bin:x:1:1:bin:/bin:/sbin/nologin& h/ H; i5 N8 S7 ?
Drink tea or ......' t1 u+ r- A  q2 t1 D
drink beer ?
7 V% f8 I& P# X, H! B3 `3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
/ a, w8 B" I/ x# Z( v3 Z: F% E3 _9 c* f.....(后面省略).....9 E% B4 u& Y8 f8 q2 a. x" Z
复制代码
. e! b/ ~  l* G) K/ I7 h4 s9 Z+ ^每一行之间都必须要以反斜杠『 \ 』来进行新行的添加喔!所以,上面的例子中,我们可以发现在第一行的最后面就有 \ 存在。6 x3 Y# N$ F/ J

* W# o/ g6 h. v) ~6 {. s  x' u' n2 U
以行为单位的替换与显示# Z0 q3 Y# ]$ `( w/ Q+ M- H% c

; J- g" Q, N4 k* o; c# A, f将第2-5行的内容取代成为『No 2-5 number』呢?+ ~% O1 j* r" l# l' G# o
- J9 ~9 ~: y0 b6 n4 X. g3 {  I
[root@www ~]# nl /etc/passwd | sed '2,5c No 2-5 number'0 Z  I4 n4 ~0 z. q2 n/ P
1 root:x:0:0:root:/root:/bin/bash& R) i( a, a- w
No 2-5 number7 B# s" B1 s. p9 }  u9 N
6 sync:x:5:0:sync:/sbin:/bin/sync
8 |0 p6 y3 r2 a.....(后面省略).....
4 U# z2 u: V+ m) @! |3 o
$ G0 F) b$ K! C! R# \  p透过这个方法我们就能够将数据整行取代了!+ b5 ?# t& ^; ^; b- n
3 s' W" P, _& n1 j

' r# s+ f8 r& w1 A: B" o9 {
6 K; b4 q8 D0 }( A$ s仅列出 /etc/passwd 文件内的第 5-7 行
$ a7 ?! U# p  P9 {. O( E- C  m- K+ m% `* h$ X* M6 y9 ~- }
[root@www ~]# nl /etc/passwd | sed -n '5,7p'
7 m  H% d; p5 {& Q2 m4 U5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin- J. A: j7 C8 s3 h$ b  T+ s1 i
6 sync:x:5:0:sync:/sbin:/bin/sync$ T8 A8 y( W" Z" q
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 v6 l% `+ L/ ^8 _0 ?可以透过这个 sed 的以行为单位的显示功能, 就能够将某一个文件内的某些行号选择出来显示。
& p6 T' [, `* G
* v, I  x6 \; k3 C : ?% j& [' S( E) a+ g$ d
数据的搜寻并显示$ N8 W9 P2 d: v( ^) G  }
搜索 /etc/passwd有root关键字的行
+ C9 x! E. [3 F- N( a( T! `
3 O! G: m- U/ _# a复制代码1 g8 {* V9 R& \) Q0 W
nl /etc/passwd | sed '/root/p'$ K0 i% Y3 j: j9 k5 h) Y! `
1  root:x:0:0:root:/root:/bin/bash% O; d/ ]0 s' u6 R9 j  F7 X3 s
1  root:x:0:0:root:/root:/bin/bash
* C% M2 E  |4 c5 R- g' U* W2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh
0 S2 W" y- A: }3  bin:x:2:2:bin:/bin:/bin/sh6 J2 k  R& [- h* Q/ B
4  sys:x:3:3:sys:/dev:/bin/sh
: R( M% D; z6 M( ^. l; a7 M8 d5  sync:x:4:65534:sync:/bin:/bin/sync
3 D" ~+ N$ A* m, A  K....下面忽略 # ?: c- ^% s" F. P3 z" d8 B
复制代码
$ G: B7 @6 G7 E' @: a如果root找到,除了输出所有行,还会输出匹配行。1 s/ B& [% p3 `4 W, H% L' S% m

4 @# i! f. P' D, z& `% A 8 c/ ?) B7 _3 ^9 K; R) i2 n1 G! S
* |/ r( M' k% u' T, o
使用-n的时候将只打印包含模板的行。
6 t2 z5 `; F8 N
5 k1 y$ l" U+ {; [nl /etc/passwd | sed -n '/root/p'
9 x3 X# S4 @2 J+ J9 L1 I2 I1  root:x:0:0:root:/root:/bin/bash1 m& r: p6 b/ k8 ~
3 J6 e+ F! [$ ?- H7 g! e$ m

# Y) }4 g! S( N/ b2 ]" Z  X  O数据的搜寻并删除$ w  q6 r" S& W+ P# k* x; B+ O" V: f
删除/etc/passwd所有包含root的行,其他行输出
! ~) ~$ I; ~; L7 _' H# ], k! d( l# Q) Q- ^, f
nl /etc/passwd | sed  '/root/d'
0 {! C) a+ q0 o% {. c) i0 V( L  y2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh* I# L+ g  N8 Q* W# J: p7 E
3  bin:x:2:2:bin:/bin:/bin/sh
* p9 l) s) K# N0 @0 ~. d....下面忽略
0 o" e8 R! ~# M3 j. G0 S#第一行的匹配root已经删除了
; l, H& F! t* Y4 } 5 ], I7 V( l9 d2 Z2 n
; n2 J9 [4 D$ |) d& z1 c

" Z+ T1 w1 F- v: k* z0 |
( g4 v3 _! s8 m* e9 C& x/ g0 F
' n' P  ~3 F5 U- j% Q7 U0 R( W3 t0 A% Q6 w
数据的搜寻并执行命令
% e/ a2 `% e3 k7 A* \' A8 s找到匹配模式eastern的行后,
$ w, P# h, m0 T# d+ J1 d* v( N: w! j( S1 n
搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行:
& @% [0 x* u9 x3 `
. d6 q3 [5 b8 l' u& G+ e; w1 E8 e nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p}'- m9 e3 v, n6 l& _; K' V
1  root:x:0:0:root:/root:/bin/blueshell
5 o# i. F( ]# w, j' s; p如果只替换/etc/passwd的第一个bash关键字为blueshell,就退出0 x4 J$ _) v+ i4 t' C; O
! k6 z' O! V& A, K
nl /etc/passwd | sed -n '/bash/{s/bash/blueshell/;p;q}'    ; D5 A7 E; l9 v* `; t% K
1  root:x:0:0:root:/root:/bin/blueshell$ M, ]9 J" l; r% H
最后的q是退出。
- p- P5 \# k3 f1 c: N7 j/ N  ]: T3 W6 u( \+ _! C

; Z4 T$ Q# ]4 G2 ^" r  j
9 b5 c8 `% v+ }) j; ]# M+ m% f数据的搜寻并替换
6 g. V, [& [- R除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代。基本上 sed 的搜寻与替代的与 vi 相当的类似!他有点像这样:6 u6 n* S; R% l' f% r* d" @
. [% S; d& H8 y! s( h6 v5 s
sed 's/要被取代的字串/新的字串/g'0 P* v( l- M" C- B2 U+ P
+ y" K* T6 M; j" z% z' V+ s, S

* M6 `8 O5 {1 I. _9 R5 Z7 E先观察原始信息,利用 /sbin/ifconfig 查询 IP; S) [8 ]- @+ m% I  A/ ]6 Z

+ r6 I7 Z" U5 h8 M. m6 o) M[root@www ~]# /sbin/ifconfig eth0. P5 C' v0 S& R1 t8 l6 ?0 d3 P& j
eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84
6 H1 X. M2 R' o7 @inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.06 x/ W5 k: I! ~0 U' R- Q
inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link  I! q+ T. O- f( \) J! c
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
6 l1 h6 W' \8 H2 |.....(以下省略).....$ ?& ~+ N9 W9 |
0 N" E7 F& y0 L) [, c3 l
本机的ip是192.168.1.100。
( `, l0 |0 L* |: }. k- g# I3 R1 s( g; {

9 @: C5 L' i: ]) A% Z" }  L* {2 Z
将 IP 前面的部分予以删除
7 a) m: y6 R- G9 X, i& k1 T( o
3 T( m0 s( V' b; M4 O1 Y[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'5 y8 t! p- M5 I0 K5 `  x9 _
192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
8 n" w! m# ~! j7 m& j" A- u接下来则是删除后续的部分,亦即: 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.05 X7 l" q: Z8 S* |: A3 V
& M6 `* \4 F' j3 `! H; Z
$ N) u% X9 Q# p$ ^0 z3 w9 p: J
将 IP 后面的部分予以删除+ |9 m6 c3 I8 E
& ]4 R, q; ^8 M( V' _1 r8 S
[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
0 K! a4 L' J2 f192.168.1.100
3 I. y5 c, P$ K! }4 _  N 3 P5 i9 Q8 ~5 w0 \( `

4 m" R: o3 z/ B多点编辑' a) l+ E# k, V& s0 J; A3 Z
一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell$ N4 q' J/ r+ o/ v
" m7 G$ l, q. f2 [0 ?$ W$ Z4 e
nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
% ]8 V( E8 n) E. M/ k9 ?' P; S1  root:x:0:0:root:/root:/bin/blueshell
. q( t0 ^+ l6 W8 h2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh( X* g/ M# l& |( y; O
-e表示多点编辑,第一个编辑命令删除/etc/passwd第三行到末尾的数据,第二条命令搜索bash替换为blueshell。' P/ h; L3 a2 G
( r1 R3 U" T, M0 U
4 v8 A- U$ f3 [9 S& h- A: R

% d" f& i/ q4 z2 `6 N
* K- V8 ~4 M9 m+ Q# h+ w9 V% V% G  G; ?7 u4 j  Z
直接修改文件内容(危险动作)
- l' u' T' T1 f
  A: O/ @4 I# g1 b' F. tsed 可以直接修改文件的内容,不必使用管道命令或数据流重导向! 不过,由於这个动作会直接修改到原始的文件,所以请你千万不要随便拿系统配置来测试! 我们还是使用下载的 regular_express.txt 文件来测试看看吧!
6 G$ y2 i. g+ i6 g9 Y" o* j, Q2 w( I" P3 h$ t
利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !
. {8 ^1 m& y$ k& G* W( }+ [
/ v, M- M5 u9 W1 R; s  r[root@www ~]# sed -i 's/\.$/\!/g' regular_express.txt1 x- A7 h0 }5 x/ s, c7 T( h  e5 s

2 H1 J+ }* g' f: P# _/ _9 }& V# m8 z
利用 sed 直接在 regular_express.txt 最后一行加入『# This is a test』/ G9 b5 G8 G# z" s! ]/ l0 T. B

6 G8 H+ g8 T6 ~7 P& K! p[root@www ~]# sed -i '$a # This is a test' regular_express.txt! ^) s& u+ `. e( y2 k
由於 $ 代表的是最后一行,而 a 的动作是新增,因此该文件最后新增『# This is a test』!
: K: f: W7 Y- I! s3 |$ H5 E8 l
$ g3 E0 ]* Q7 T) f" }2 jsed 的『 -i 』选项可以直接修改文件内容,这功能非常有帮助!举例来说,如果你有一个 100 万行的文件,你要在第 100 行加某些文字,此时使用 vim 可能会疯掉!因为文件太大了!那怎办?就利用 sed 啊!透过 sed 直接修改/取代的功能,你甚至不需要使用 vim 去修订!
3 t) f) @! P5 x
! d7 V- M, ]2 a0 T. N! h
copycode.gif
回复

使用道具 举报

 楼主| 发表于 2017-4-13 11:57 | 显示全部楼层

, }6 P8 H+ C1 N0 k  d! |1. Sed简介
; L$ k& y% i/ `7 { ( Y6 h8 a( A2 B0 R! O: [  P0 Q# e
sed是一种在线编辑器,,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。以下介绍的是Gnu版本的Sed 3.02。
9 I7 H2 l; Q' k1 E, q" U# I 9 o3 w* z2 O" D+ d/ u& q
方法1:
* n( @5 j! t- R" V. T, O sed -i 's/被替换的内容/要替换成的内容/' file
9 P5 I* ]# m2 f* i" ~  a9 T
. m/ N- k( z  Z) F; U5 W$ s方法2:
. j8 b8 F3 O2 t* m1 C0 U sed 's/被替换的内容/要替换成的内容/g' file > file.out/ B: l" ]$ u4 u9 Z: C
mv file.out file
7 ^! K9 |& s- [, \" _* }  ~% y* M7 u9 B
# B9 a3 A; q9 D$ H. J  x# A这里注意:% T% R$ `4 n+ Q, n9 R+ x# u( ]
不能这样做:
* ?; E: ^/ _$ p7 w sed 's/被替换的内容/要替换成的内容/g' file > file
# t5 [* n  Q* C, W 这样只会清空源文件。; G- Z  m5 D0 }* a7 P9 q

) D# n) D) O; J8 e
  Z. I6 _0 ~8 |- e, N2. 定址& \8 H6 P' H' I

7 f. F# X+ c& x, i9 B. r$ V* [可以通过定址来定位你所希望编辑的行,该地址用数字构成,用逗号分隔的两个行数表示以这两行为起止的行的范围(包括行数表示的那两行)。如1,3表示1,2,3行,美元符号($)表示最后一行。范围可以通过数据,正则表达式或者二者结合的方式确定 。
5 w0 s$ v. K  g, ? 9 y  w+ d2 K/ t; r, N' H
1 X3 t( X" G* w3 b* x" ~
3. Sed命令
1 ]3 i0 \# Q4 v# l' U , v% K; X' F  j5 H
调用sed命令有两种形式:
$ k7 ^4 K+ o" ~' g
* e0 q! t6 y; Q& }- u! j$ z' w' a! q7 `
sed [options] 'command' file(s)
0 f  S) B, x- x! V% n# W
8 U7 q$ a+ o3 psed [options] -f scriptfile file(s)5 v+ G, E$ S% I

% B0 p9 A" ]- X# O7 q
! G& E/ k2 N, k; G6 j< % z/ a# n6 v4 x1 u6 e
a\
% k' t+ i3 \3 x$ B$ a& J8 t 在当前行后面加入一行文本。6 M& X  U8 J+ l  {( s

! ~8 I1 Q# `% K( B' [0 hb lable 1 n' d$ s% k* {! U9 k+ \; P
分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。% x1 C7 _# P# I* ?' r: C! w2 F

% I3 a$ z3 G/ z" O2 w6 cc\
  e& R) c4 J4 G- b0 A/ F0 y6 [/ d: X 用新的文本改变本行的文本。' o. C! z4 m/ T! H( R, m1 ~. n
& s$ A" J7 y/ U: Q! d% C1 C
d
  n7 p+ g. R% j  ?3 W 从模板块(Pattern space)位置删除行。, y: F- B+ Y# h( s8 z

! Y7 M# B5 d- F7 H+ h8 [  f' n" oD 1 }3 v+ u! |: `) G9 |+ v
删除模板块的第一行。6 a/ J, K: v$ a

0 O' B) ~1 y# o* j/ N( _5 C! ni\
- \! X2 O' G* w9 [, }# ?& U3 ~/ \ 在当前行上面插入文本。
$ P8 V; _* j; b/ S, F! |9 H0 Y
7 F6 K2 m& P! V- E8 O  n8 X1 Lh
, I# k4 R, K- M6 v 拷贝模板块的内容到内存中的缓冲区。
' F5 b$ N! k% Q/ i( V$ C
' b3 f# o9 T5 t3 ^3 LH # u* A: Q2 G5 {
追加模板块的内容到内存中的缓冲区) t) s. d. s* o" u* S; }: h; c

1 s5 \, o* Y: Q+ q3 ng & O6 A0 w0 f5 D& u
获得内存缓冲区的内容,并替代当前模板块中的文本。
' j$ A2 H& |% U8 M9 s3 X
& L6 c9 k* x2 EG 8 l0 L3 P  Z2 U0 J
获得内存缓冲区的内容,并追加到当前模板块文本的后面。$ X# f* B5 x( M7 r) o2 ?% X+ R
0 ?! f0 ~* r; \' ^& t
l 1 f' [* u! N+ j5 V9 w
列表不能打印字符的清单。
" {% c9 [# o9 {6 `( M
. ]+ G2 |9 m8 [- t) t' D: Yn
5 c3 f, n3 r0 w$ M+ p# L0 p 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。/ K3 G/ ]/ p0 L  d+ W7 j# U) N
' B! o4 Z7 Z3 V: `% }
N
6 g) Q- e/ v( r- g 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
( |" G% ~) M7 o& h4 {' k8 W
4 h1 i& p1 a" |4 ~) m0 Pp
$ z) F# R3 n  a" a) }' Z% H7 a 打印模板块的行。
5 H4 L9 A2 i& W5 T1 D2 I
/ s( U; N$ G. M2 o: t  l/ [  C* yP(大写) # n+ R2 G* t3 x1 ]% v, J5 I
打印模板块的第一行。
  a7 y1 t% p0 Z/ p6 x
7 ]9 A9 f! Q' k) g  |1 |' sq
  F) w/ v* h* V7 K0 r 退出Sed。
" t1 T. w: N- M, k$ c
* {! p6 z5 q/ l* E* o9 ?' h5 d# Or file   W! {. `* {& Q) ^
从file中读行。
$ r" N& }  w: T/ B* k7 Z
2 q' s3 |- b$ r9 Wt label
; y' a& D  V4 B8 j$ Y+ q/ v' g% k. v if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。  M. V! y( ]: }  t8 Q

" v( T, L% R4 `8 @3 V' pT label
; c! e% N4 T& u3 P 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
* R) P# s3 {7 p$ c5 n0 O; U) X " ?# m3 F% y# U9 O& j& h* d1 ~8 k
w file
7 G0 C5 ]$ T: R: S; U. B3 O* U 写并追加模板块到file末尾。* O% U: F/ y) z5 B& Y
$ M) s7 q9 z* q& D
W file . G% x" }! g0 w- c) C7 f
写并追加模板块的第一行到file末尾。
( p) I4 A; R8 ` ; H! s2 G7 _6 Y
!
6 ]8 X0 B+ w2 B. ^ 表示后面的命令对所有没有被选定的行发生作用。
: B( m3 ]3 r9 v9 p6 X
# }: k' N' i4 b- B" g: ]s/re/string
5 \8 A0 x3 d. Q9 {+ ^. J/ w 用string替换正则表达式re。; x% x7 y3 f4 A' H9 N' N

; X8 q: t4 @( v. y& {' M( C2 ~=
2 K' h6 ?3 Q* Y* A* P8 D( }* |- ]# t 打印当前行号码。
- l' `/ q2 r5 W! U
, w5 g3 Z0 F' v" f* U) T#
# f* [2 t' Z0 T3 {8 m: A# Z 把注释扩展到下一个换行符以前。
# {9 `/ g7 t2 a- Y2 E 5 `3 b3 ]  J9 v
以下的是替换标记
. U4 V- ?4 @2 Q8 @- i ! ~- _1 X/ _. y' O2 G2 q
g表示行内全面替换。: E) P/ f( c; s6 g9 P
" Z. N6 p5 r9 w3 }/ \; I
p表示打印行。
8 C/ m) I6 k1 Z: P5 y6 p% x
; i. `" ^6 u2 Z9 aw表示把行写入一个文件。
9 r- y' n; k/ c, K  A, y
5 w. \& T1 d* F2 Px表示互换模板块中的文本和缓冲区中的文本。) E* F3 @/ x2 U. c% v
& {) I% A3 K4 ?, ?$ z
y表示把一个字符翻译为另外的字符(但是不用于正则表达式)
. D- f: ^/ {+ q1 x8 J$ L; u9 q2 y4 N9 I; h$ E+ x/ S! L3 X/ z
linux
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2026-4-17 16:27 , Processed in 0.041612 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表