一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 4255|回复: 5
收起左侧

linux之sed用法

[复制链接]
发表于 2017-3-25 09:05 | 显示全部楼层 |阅读模式
sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下sed的用法% @; }: _4 o0 I# ~" V! p
sed命令行格式为:
0 x3 O9 k9 q$ {8 }2 m- \8 K9 u         sed [-nefri] ‘command’ 输入文本        
常用选项:9 G$ b6 P/ H& I2 @
        -n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
3 i' S- W* Y) U        -e∶直接在指令列模式上进行 sed 的动作编辑;5 d# Q) N9 w" T, Y2 e
        -f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
- |& _. a7 s) w9 |( {) r; \        -r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)6 K4 c4 e7 e* h: o# k
        -i∶直接修改读取的档案内容,而不是由萤幕输出。      
常用命令:/ H8 N% `' B" w3 j: G. p! Y$ a" |
        a   ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~5 j5 ?' k+ B! _$ A' h4 m
        c   ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!$ z" s. S) c/ b6 ?# q
        d   ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
9 T* o" Z# R$ z" c5 B6 v         i   ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
% a" i4 P; D* i# J4 V7 k         p  ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~! j4 d, o7 @- o: K8 r) f
         s  ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
举例:(假设我们有一文件名为ab)6 W; y0 n! u: O& @) z5 U& Y& L+ W
     删除某行
4 i) c) a( ^1 Q, y     [root@localhost ruby] # sed '1d' ab              #删除第一行 9 O" H- d5 h# U) Q& f
     [root@localhost ruby] # sed '$d' ab              #删除最后一行' h1 ]# I& t4 p2 i5 j5 q
     [root@localhost ruby] # sed '1,2d' ab           #删除第一行到第二行( m. i% y# i9 n; C
     [root@localhost ruby] # sed '2,$d' ab           #删除第二行到最后一行
  显示某行! e# I. E& v" M% F
.    [root@localhost ruby] # sed -n '1p' ab           #显示第一行 ' V+ f) E, G; j. z% O" i1 o
     [root@localhost ruby] # sed -n '$p' ab           #显示最后一行  w+ {: J4 z* u, \$ A8 ~( y
     [root@localhost ruby] # sed -n '1,2p' ab        #显示第一行到第二行2 A; t) f9 y3 q2 F7 {. _2 S3 D
     [root@localhost ruby] # sed -n '2,$p' ab        #显示第二行到最后一行
  使用模式进行查询
  h. C- E4 ^- _5 `5 i7 _, O) c     [root@localhost ruby] # sed -n '/ruby/p' ab    #查询包括关键字ruby所在所有行
$ X" {% V8 ]9 b     [root@localhost ruby] # sed -n '/\$/p' ab        #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义
  增加一行或多行字符串
. O. F- k. {- k     [root@localhost ruby]# cat ab, O! H: f( `( b! h! `( a, M4 n7 t9 }
     Hello!
  ~9 ^  |) g2 M1 t4 a# ~" v" X3 {) {     ruby is me,welcome to my blog.* L3 @$ R0 @+ f$ ?% P6 o
     end
4 A7 A% Z9 l& f  X     [root@localhost ruby] # sed '1a drink tea' ab  #第一行后增加字符串"drink tea"
+ D* k, H  L( T- A: b     Hello!/ b0 H. ^! y% M5 I9 O# `6 [. }. M6 X
     drink tea
& z" K$ g% h: v' U' k- |     ruby is me,welcome to my blog. / C9 i$ E9 A3 [0 T* }
     end
' [8 |- E; k  b4 [/ I1 E$ W& Q     [root@localhost ruby] # sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea"
+ l' q( |" _7 `3 o4 }7 i- t4 K     Hello!5 X( g/ f2 A4 k4 J. D' K
     drink tea
; M! y4 I5 y0 [6 E0 }     ruby is me,welcome to my blog.
( V# p; B( R* L  o; U7 z& M* O     drink tea3 @. \; g" }8 D# d! f& M
     end6 m. x* J* }9 u" a4 q7 Q
     drink tea( b/ @# v1 g% G8 ~1 q
     [root@localhost ruby] # sed '1a drink tea\nor coffee' ab   #第一行后增加多行,使用换行符\n% x9 P& H0 n9 W
     Hello!
8 `* l% c5 ^. x+ y7 |8 u. z5 K1 M     drink tea9 |; u2 R' |7 ]: ~+ z4 `. Q
     or coffee2 g# Y/ g. |( |/ s
     ruby is me,welcome to my blog.
$ H! m$ g' o% ?) b     end
  代替一行或多行
7 p* P6 p: A5 T9 t' ?     [root@localhost ruby] # sed '1c Hi' ab                #第一行代替为Hi
! D9 p1 w% q1 y' j$ |     Hi
7 n9 l. d" d% s4 h6 c- _/ I     ruby is me,welcome to my blog.+ Q/ U' `$ B9 M) _
     end
( w8 v5 p& ^1 r; b8 O     [root@localhost ruby] # sed '1,2c Hi' ab             #第一行到第二行代替为Hi
% Y; C/ I2 Z1 _( w7 ?     Hi" V+ h/ [8 r/ @4 p0 t
     end
  替换一行中的某部分/ V, j. ]2 W) b( z- ~
  格式:sed 's/要替换的字符串/新的字符串/g'   (要替换的字符串可以用正则表达式)' ~" q! {# q& h# Y6 y) r* F
     [root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby/bird/g'    #替换ruby为bird
8 D- Y+ _' U7 j6 p4 w- s# B" ^& J   [root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby//g'        #删除ruby
     插入
, U3 h) {0 ?3 H/ V: ^) g* X     [root@localhost ruby] # sed -i '$a bye' ab         #在文件ab中最后一行直接输入"bye". [" e6 t! {0 I! p( V- I
     [root@localhost ruby]# cat ab
! e# v& T3 b2 d; a     Hello!
% F' o: h& A8 a( y; w, p0 v     ruby is me,welcome to my blog.- U/ x4 N$ n) P$ {2 q; x% m4 W
     end/ z( L8 a+ o! J
     bye
     删除匹配行
      sed -i '/匹配字符串/d'  filename  (注:若匹配字符串是变量,则需要“”,而不是‘’。记得好像是)
      替换匹配行中的某个字符串
      sed -i '/匹配字符串/s/替换源字符串/替换目标字符串/g' filename

  S$ \$ Z- x9 d6 i6 \$ z

7 m4 X7 K5 c: P  o& i+ L
# D: n+ u" p" _6 A- Y8 o& O6 D0 c* u9 o# q& G( K3 o
$ Z# A7 M6 b/ K, Z' b9 B: n
发表于 2017-3-25 10:09 | 显示全部楼层
sed+awk只是听说过是神器,一直没机会学习,跟着楼主学起来。谢谢楼主~~~
 楼主| 发表于 2017-3-25 10:14 | 显示全部楼层
zhixiaoyuhong 发表于 2017-3-25 10:09
' q) [& ?* P# S6 Used+awk只是听说过是神器,一直没机会学习,跟着楼主学起来。谢谢楼主~~~

8 u2 z& O1 E2 F: W, u客气了,大家一起来学
 楼主| 发表于 2017-4-13 11:51 | 显示全部楼层
linux sed命令详解7 r1 C4 F2 p. D* n
简介
) H% c; m. b- |/ ]/ R/ ?$ E" h8 used 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
" k( _4 J2 d7 {% P( L6 H
1 N  w, c6 \$ a' G7 p8 j 1 V" g* H! Y: i, R9 V

& X; T( @& m. C; u' K3 R; nsed使用参数0 n3 n7 I! p3 R' o6 N* ]+ S- s) A
复制代码. Z, v: [# n/ X& B1 v  y$ k- X
[root@www ~]# sed [-nefr] [动作]& ^3 K) a) I8 \, t& X
选项与参数:
( A6 R# ?) p# }- q( c-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。! S; C* ]$ `5 o
-e :直接在命令列模式上进行 sed 的动作编辑;, p" g3 v' }5 P3 m% ?  o$ X
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
! V# Q3 Q7 U& i5 J, e* [$ R-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
' ~+ e. A' Y7 }+ ~" H( ^8 c-i :直接修改读取的文件内容,而不是输出到终端。) j, W4 g1 N6 T
" Q8 a3 b; d. f6 j6 p" M' B8 G. w
动作说明: [n1[,n2]]function
; J2 {! w5 s1 e5 u, Cn1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』
- B3 `' J# i$ f7 D; h, Y+ U2 U- h) a! u
function:
  y% }4 s7 D3 G6 _9 x7 a, }" Za :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
4 u" x+ R4 T& x9 h4 sc :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
7 r- l$ F/ ^- x: {$ Ed :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;/ ~( e) x, s; x) f
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
- v( C5 k% W: K$ {: op :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
) z8 a; ]# a1 r2 _: R- L8 Ds :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!1 O0 J8 f: w$ Z
复制代码* f" i6 [7 U& Y2 w" D
* h; z2 ^4 Q' [( ^& H1 w7 U( N! d

2 U2 _" D2 s5 z' W% _, h$ v以行为单位的新增/删除6 ?# I* M5 x7 d2 ~+ P2 [

. l2 W: z% T$ G) }* V将 /etc/passwd 的内容列出并且列印行号,同时,请将第 2~5 行删除!
6 g9 O: |  E7 A9 k( v( `0 |8 `7 F1 R/ B& |, _- R
[root@www ~]# nl /etc/passwd | sed '2,5d'+ x  q0 ~' @3 J
1 root:x:0:0:root:/root:/bin/bash
3 p/ R, I2 h) Z. o' {6 sync:x:5:0:sync:/sbin:/bin/sync
" O! W0 P: n2 O; K$ `* s7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown4 v- ^* ^) X: g
.....(后面省略).....( u! K- R+ G( i. _) S5 F9 a
9 d3 c# w' }& e5 B* |7 \& A
sed 的动作为 '2,5d' ,那个 d 就是删除!因为 2-5 行给他删除了,所以显示的数据就没有 2-5 行罗~ 另外,注意一下,原本应该是要下达 sed -e 才对,没有 -e 也行啦!同时也要注意的是, sed 后面接的动作,请务必以 '' 两个单引号括住喔!7 A- z: ~9 L$ i9 r8 L; t& k

( E" I! b1 R6 E1 o3 B3 ]只要删除第 2 行
4 Y% r% B# Q! i7 @4 M$ m+ u- J6 f
nl /etc/passwd | sed '2d' 5 m" a+ E4 H9 n7 ^# y! s' W! g
7 Z7 y0 ^$ N% V7 }

3 j3 M9 }8 ]0 z2 g要删除第 3 到最后一行% P5 m. q% L0 S9 h+ D% e- w; Q
( d1 u9 w( n1 S9 s. [9 t
nl /etc/passwd | sed '3,$d' ; f8 C, X4 Y; ^* v! L; r

$ n9 N, ]2 e  Z4 E. E8 a& q7 T/ G  G/ S& ]
在第二行后(亦即是加在第三行)加上『drink tea?』字样!
8 O# E9 ^; b& V% s/ M5 N2 p2 h1 t/ N, i" K1 X. f- B
[root@www ~]# nl /etc/passwd | sed '2a drink tea'
, P% T; P5 Z6 |1 E( A1 root:x:0:0:root:/root:/bin/bash
" k9 p" r/ j4 V, N: S) H; ^1 N2 bin:x:1:1:bin:/bin:/sbin/nologin" s9 m' z' U6 H! M, p3 j8 h
drink tea, c2 H. c% r5 m+ H' C
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
, [; \5 I; E7 A$ n.....(后面省略).....
5 i% v6 U6 q0 d7 b/ i1 p8 m( q  c
* g& N: I3 u) D* N3 u
' `, \) ^7 y- F+ @& [0 h那如果是要在第二行前# m  T$ [; j) k+ O& Y1 [$ e) f8 O
( ?% n' c* g4 y6 b! X
nl /etc/passwd | sed '2i drink tea' ; U$ J6 ?* F  S

, f$ Z2 c2 c; H/ n
. V9 q" K! `* o" @如果是要增加两行以上,在第二行后面加入两行字,例如『Drink tea or .....』与『drink beer?』2 f9 M* T3 `; Q" M; o  K+ U

* _! X- P: H2 [, L/ s复制代码9 l& [4 V" Z% |6 q+ i
[root@www ~]# nl /etc/passwd | sed '2a Drink tea or ......\
% N! T- R( B- x4 K1 a8 x> drink beer ?'& I$ U0 o. V7 ^' F$ G) i
1 root:x:0:0:root:/root:/bin/bash
3 E; V. G$ l$ D" T$ P) m2 bin:x:1:1:bin:/bin:/sbin/nologin
' ]7 S) j; O- W8 L" y  TDrink tea or ......
" m1 P1 K# i  Q  [, h! [: j. Xdrink beer ?4 e2 Y% h4 t- F
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
0 `' K, I, ^: x) b& |# W.....(后面省略).....$ s2 x& |5 s4 P3 [2 d. A" I9 A
复制代码! I( g, \% M; z. X  E7 _. J  X
每一行之间都必须要以反斜杠『 \ 』来进行新行的添加喔!所以,上面的例子中,我们可以发现在第一行的最后面就有 \ 存在。" _& z* B1 S' @/ X0 o

) q; l* q& }# r/ d
4 @1 X! O! A2 y7 D6 ?/ T以行为单位的替换与显示( |4 N# F5 G. N( }

6 j$ a, e; a% K  o将第2-5行的内容取代成为『No 2-5 number』呢?
6 _* t" \+ Q! L2 r, f# V9 B& E. R7 C* f- U5 i$ S! ~
[root@www ~]# nl /etc/passwd | sed '2,5c No 2-5 number'1 i( L8 ^. _1 G/ d7 Z- c
1 root:x:0:0:root:/root:/bin/bash; C7 i9 s5 m. v) E1 U+ Y
No 2-5 number
! V. x* S0 S2 E) [1 f; M% D6 sync:x:5:0:sync:/sbin:/bin/sync
+ t# f6 q3 W" g; w* X.....(后面省略).....
# f- C: s0 }8 U1 b
* |5 ]" i5 ]& Y透过这个方法我们就能够将数据整行取代了!5 _7 b6 U* z0 L# w7 H

) V* }$ u5 S6 O7 h8 D5 S
1 v5 O* ]( ^' f6 G5 o6 E6 d/ k7 @5 r/ D) @$ z; G& t- y
仅列出 /etc/passwd 文件内的第 5-7 行
  W6 L6 h" q3 B# ?( ^
: ?' I# W4 y# v1 o[root@www ~]# nl /etc/passwd | sed -n '5,7p'
2 z- C; D! d/ g0 L) ?" ^5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 }8 i: I& x' f- S# L
6 sync:x:5:0:sync:/sbin:/bin/sync/ H6 B( G; I7 A; W0 R
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown5 x1 S; M& a2 a: r" _
可以透过这个 sed 的以行为单位的显示功能, 就能够将某一个文件内的某些行号选择出来显示。
0 e3 [6 ~- I% G7 U0 B! {; q% J  f: Z4 Q# u  ]
1 u/ g$ l- n( i
数据的搜寻并显示$ ]5 ?2 f/ `/ x. ~# G
搜索 /etc/passwd有root关键字的行
; L; L) Q2 k! P) _. i( U) h6 I8 |. f4 K# Y+ }% t$ `
复制代码
6 {( L: t' n8 j6 |) n/ T) Hnl /etc/passwd | sed '/root/p'
; F, I) {' P1 r, t: A) O3 ?5 g1  root:x:0:0:root:/root:/bin/bash7 W1 b7 ?. Y9 Z5 _8 A2 ?1 T' y
1  root:x:0:0:root:/root:/bin/bash' C! s* L- T* m0 x
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh
7 }, F) o0 P$ A# ~* d) H9 _3  bin:x:2:2:bin:/bin:/bin/sh1 x0 d& N, Q8 a% V7 Q
4  sys:x:3:3:sys:/dev:/bin/sh% |+ X( H  `, ~# O
5  sync:x:4:65534:sync:/bin:/bin/sync2 u& D0 T0 W* X  c7 d/ |
....下面忽略
; P. z5 N, F2 j复制代码
1 ~0 z3 @; |: z如果root找到,除了输出所有行,还会输出匹配行。5 H# w0 z- ~% L/ I4 Q& p" X& P

+ n1 l0 g( D. g# o- r
8 v* w( r! L/ F" j  ~0 s1 U
5 Z& E* T/ C. e) G1 u使用-n的时候将只打印包含模板的行。
* f( t% O6 ?: f6 P* m
# b# W: O1 {1 h7 D: T5 gnl /etc/passwd | sed -n '/root/p'
& Q# e+ K$ v# S4 ^5 s8 C4 L/ s* x1  root:x:0:0:root:/root:/bin/bash+ ~4 O, I5 s: ~. \  G, L

+ c) U) D4 V* [& W& i5 A
  j2 v4 A. }+ q1 j. s- T' E数据的搜寻并删除" ~# O- |$ D3 K5 @8 U& c& G9 i* f6 `
删除/etc/passwd所有包含root的行,其他行输出$ I8 Y. {' {. q  b- l# }

+ s  }3 h9 @6 a0 y1 Znl /etc/passwd | sed  '/root/d'1 j/ ?1 I6 _6 w9 n, [4 q3 q; e: l! x
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh, _% E' }% o$ a! [/ x* F
3  bin:x:2:2:bin:/bin:/bin/sh
2 a7 i& [4 B; r! N9 a....下面忽略5 G9 `( E3 y0 e5 z, T8 X
#第一行的匹配root已经删除了) }. e$ `7 V  Q! X9 B9 _& q
; T6 h$ n0 [9 k- _6 q6 Y! h
2 ^/ @2 l9 f4 ~
. W+ s# H' Z. M
0 _; G" v2 [, R# ?+ V" g0 ]6 R
6 J5 f' T7 s4 A! s$ Q) o

! x/ c  |; G* d5 B5 t6 X: E数据的搜寻并执行命令
: _, j. X- u% ?2 ]5 e, N- ?找到匹配模式eastern的行后,! [6 Q7 T) I: H+ r1 [8 D; ^7 ]  C

; t7 B' O* v; i0 D* `) I搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行:6 t! H/ {: L7 t# U" \4 G
9 z8 y" |4 A; b$ S+ x( g3 w
nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p}'  I) a- J; u& a" p8 r3 a
1  root:x:0:0:root:/root:/bin/blueshell  Z$ p- F% z& f  C$ h
如果只替换/etc/passwd的第一个bash关键字为blueshell,就退出
% G" A  @) ^0 @! \- B) H% t5 q1 l) M( [( P/ g
nl /etc/passwd | sed -n '/bash/{s/bash/blueshell/;p;q}'   
+ F8 Y) m" q% V, k1 c7 k. X1  root:x:0:0:root:/root:/bin/blueshell
: E& r1 Y5 ^& N1 i9 J最后的q是退出。
6 d6 b" S9 d) A) M: a. P
" X& Y" e" k8 c
  H+ [5 i2 h7 @( Y1 U3 G* F$ I8 `& u2 |: X' }
数据的搜寻并替换
& O. Q2 ]+ N! E5 o除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代。基本上 sed 的搜寻与替代的与 vi 相当的类似!他有点像这样:- ?* q/ D3 J$ o* f9 U- S

- m& Q$ h2 g' H) b, Xsed 's/要被取代的字串/新的字串/g'
. m7 o6 b- @9 J3 b5 C; t
6 \: R4 j1 Z5 [& E/ N; \2 k$ X" V
, Y( E# H6 ^; i$ A先观察原始信息,利用 /sbin/ifconfig 查询 IP( q0 z$ P5 X  }
% N+ f* H8 y& y0 H+ M: }
[root@www ~]# /sbin/ifconfig eth0" |9 c& N  p. V, {' x1 x! W, {
eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84
* z# G: W# w! t1 oinet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
1 w$ U6 k  ]/ o( C9 uinet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link# P: [2 P( o. _
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
! M  X% U2 ~  h  n6 ]8 a9 }2 w.....(以下省略).....5 `4 X3 }3 P7 Y6 n' q% r! C

, {/ V) \0 u1 b8 c本机的ip是192.168.1.100。
8 A1 A3 [/ b( }8 ]9 \8 ]* K' T
) X9 u# G4 A: _, y1 z7 I& ~$ _
+ V1 n% {' ?0 m/ {4 @! P/ q$ A) |# U
) r- Z* t8 l) Y将 IP 前面的部分予以删除4 y9 i3 H8 W, f) M
! N& t/ e& {3 z0 U( ]
[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'! e- W9 l: \. q" T
192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0/ `7 ~) I- I% {) ~7 n' [
接下来则是删除后续的部分,亦即: 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
: O5 q+ L, U+ q. M7 j! Y6 N% L' {+ U, b4 B0 S

3 G" ~9 g( G& w1 {0 V- w# ~+ [将 IP 后面的部分予以删除
3 ?, e+ x. ?- w! K1 P9 ?. L; {) b9 a5 P5 N/ D
[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'. q3 }: t2 }6 z+ c) t
192.168.1.100
8 ^) E$ @$ N. ~) @/ F! V 4 ^4 N$ l% O$ ?' m

' o% S$ r. s- q9 r9 S! |+ U多点编辑
; G" S) B1 |5 k% }  C# K/ V% F+ e一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell$ U! T! R+ O% a' n, ]

( ]3 o4 a8 J. v. N# Anl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'4 ^  d- x7 e  p9 M) G& Y
1  root:x:0:0:root:/root:/bin/blueshell
4 v- z- i7 P& Z7 z. R2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh
- ^( ^* Q* U# Y/ z! v2 M-e表示多点编辑,第一个编辑命令删除/etc/passwd第三行到末尾的数据,第二条命令搜索bash替换为blueshell。- h  g1 }4 Q6 w( N; q
8 O: D5 u) K" j0 x; \
# f7 \3 m# c; n
6 |6 Y7 R7 K; I; R7 P& ^8 j0 h- ~

% z5 i/ z% n& G" g4 X  N# `* D0 {% f
直接修改文件内容(危险动作)- e: L# Q' U0 P/ C0 g1 N4 P
+ G( r& t' a, _/ A$ ~2 o* P
sed 可以直接修改文件的内容,不必使用管道命令或数据流重导向! 不过,由於这个动作会直接修改到原始的文件,所以请你千万不要随便拿系统配置来测试! 我们还是使用下载的 regular_express.txt 文件来测试看看吧!
  D' w8 g5 Y) U: e# R' Q! l1 a: c/ |( W- i6 h! h  J
利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !& i: [! D: G" Y6 S

/ i6 q: F/ E+ b( W[root@www ~]# sed -i 's/\.$/\!/g' regular_express.txt
8 i6 s+ {1 x' {  k' d& E . P1 m/ `  d7 c' B0 {! L6 I$ X! p
! ^) k0 m9 k, N6 h1 ^/ J8 t
利用 sed 直接在 regular_express.txt 最后一行加入『# This is a test』9 k8 W4 f8 Y5 Y& u$ h/ K
5 D" P. S' p9 H
[root@www ~]# sed -i '$a # This is a test' regular_express.txt' K. N1 Q* C6 u: P
由於 $ 代表的是最后一行,而 a 的动作是新增,因此该文件最后新增『# This is a test』!( ~; [3 K  V. F; }# h

- I& l3 T7 D/ l) P' V$ xsed 的『 -i 』选项可以直接修改文件内容,这功能非常有帮助!举例来说,如果你有一个 100 万行的文件,你要在第 100 行加某些文字,此时使用 vim 可能会疯掉!因为文件太大了!那怎办?就利用 sed 啊!透过 sed 直接修改/取代的功能,你甚至不需要使用 vim 去修订!' Y( d' N2 J! I; ]1 e  Z- U

& t1 f. q) ]+ Z+ L! @- a$ _' ]& g
copycode.gif
 楼主| 发表于 2017-4-13 11:57 | 显示全部楼层

  V7 O& `* {" v1 `1. Sed简介
5 J- R* ]9 K; m4 f
! a; f  i& ~" I+ g" w* Dsed是一种在线编辑器,,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。以下介绍的是Gnu版本的Sed 3.02。. a/ N1 A" D! g9 w
7 n7 L6 U" I  [! V
方法1:
+ M) c* T1 L: ~$ e4 ? sed -i 's/被替换的内容/要替换成的内容/' file
: a, L" ^9 n" {7 { 1 F: G: b3 u7 u# Z) {" h" A) f
方法2:7 o2 a/ l+ H8 H. p6 k
sed 's/被替换的内容/要替换成的内容/g' file > file.out
4 k5 y7 s8 i% U mv file.out file
  m8 o# m. |; T# I# t/ o
2 \0 w1 x* c& j* N这里注意:
3 Y7 r+ A7 J$ `: t/ j 不能这样做:/ `1 B. O- q+ B1 Z
sed 's/被替换的内容/要替换成的内容/g' file > file
6 a2 K5 ]2 W: ? 这样只会清空源文件。* W* S1 K6 h7 K  N) C9 i; U
* M% L; _) e: R( J$ J; f

+ J; e$ N+ S% D' }9 w" y2. 定址
2 M3 r3 P' F  M; W3 h, s$ Y- H 4 ?+ _; s0 U) o% t
可以通过定址来定位你所希望编辑的行,该地址用数字构成,用逗号分隔的两个行数表示以这两行为起止的行的范围(包括行数表示的那两行)。如1,3表示1,2,3行,美元符号($)表示最后一行。范围可以通过数据,正则表达式或者二者结合的方式确定 。; P: y1 X7 X5 i5 q% q

# ^  h/ [0 D' c$ l: Y1 `
) r* ~5 N  P/ N& B: n9 p, O* I  v3. Sed命令5 N  G6 y- E% \4 l& V1 z

3 h9 q) F* E5 e: z8 K  D. m调用sed命令有两种形式:9 u7 v; O$ [* {# ?

9 T% ~$ |% M+ `4 l* ^9 a6 U
: L5 Q& n" O' q7 t( {sed [options] 'command' file(s)0 A5 b7 q: a+ m+ V( m8 x
. G5 n' g3 x  O3 s3 W
sed [options] -f scriptfile file(s)
3 |! s9 I1 I) v9 y" P2 e$ J* p - A% l. q" t& l

& N; x0 V$ l. R% R< 3 i5 G* A4 O) W% L. N  Z
a\
0 x+ g. Y$ ^# x% m' ^ 在当前行后面加入一行文本。: ?' M/ i& I% l8 _5 \+ p$ }

1 Y) V' R' ?" A- y0 s7 Rb lable " V  I0 m3 c4 _. z% [
分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。) Y% j) Z* r- }* S6 i2 U4 m" E- [2 _
+ s6 l" }) K8 D4 w6 J0 `" b* R
c\
- A+ a( `5 r' M 用新的文本改变本行的文本。
) i6 h6 o- b/ V* I" l# n5 {+ b / [: e( W; S" b
d
& k4 R; R9 E3 H1 _1 E0 q 从模板块(Pattern space)位置删除行。
8 X6 m5 x# T% B ; S! V' }: J# ]1 f$ [5 U- S
D
) n: l6 i! C5 D& Q0 m1 A 删除模板块的第一行。3 K% I8 Y5 |$ W) O
9 t$ c; {7 P, Z* g1 a" z
i\
  @! P) C, ^  j1 y: J) a 在当前行上面插入文本。2 @3 @1 n4 m1 D% x: A$ ~
* F. j( s6 p9 o+ F) K
h
$ }  Y# g! `4 ?2 w 拷贝模板块的内容到内存中的缓冲区。( v# e' B6 p" J5 C5 N

6 Q9 `6 C. D* W7 j* M/ s& aH ' p- I. x- X7 ^3 |) ]5 U& O$ h
追加模板块的内容到内存中的缓冲区  O( D0 E$ q% ?5 O) c' G

, c4 h2 m# [; [4 [1 Ig
. o) V: v& W! z, D" \* M. { 获得内存缓冲区的内容,并替代当前模板块中的文本。, H7 t+ u3 Q" X* a/ J' j( v" |
7 R% a1 ]& N! v: D
G
/ F- a# R4 x# D' N: T4 Y! { 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
6 C0 \1 ~, B  s6 _( s/ T. I
5 J9 Y( W! K% yl / d  _  E. o( b- C. J6 V# G
列表不能打印字符的清单。
: Q: G% o# a# |  ~; q9 r$ `
* K4 y' h, v1 k( nn * ~* _2 |9 s* B$ J2 Y6 o6 U5 u
读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。4 g9 [1 R4 k% s- O) F* E0 A  ?

: S8 u' e' `; t# X* o8 s/ ]N
0 B) a0 P  f$ C+ m# S+ _" [ 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。1 O( g5 E6 l* Q
8 {3 r* w: g0 }; Z: Q& O  s
p
  d, Y$ X% e5 V7 Z  _  c; _ 打印模板块的行。% i0 g5 x1 C% ?1 S) D+ M5 `

9 U" ]/ A. T0 M* {5 y3 r: QP(大写)
4 e3 c) k, m! a2 m  \0 d 打印模板块的第一行。- j( c; {, _$ b4 N4 }7 f) P/ b
$ F* R3 Z) J# z- b5 h3 ?4 i
q / h7 y0 c, G' w/ T9 i3 L8 i+ V$ W- T# v
退出Sed。
& g( H. `7 U5 L4 G" F8 h+ f" @ ; t: E6 t3 H7 v" z6 I  r; Q6 |
r file
6 g% {" }) o% ^( U( o 从file中读行。
1 }  X: n2 T, i* k9 D 1 n7 c  k+ L' r" Z
t label
: l/ z2 Y- `: x! B1 z4 b if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。  }: c# S, f% ^0 O
, q# s* z& _3 o: U- c, e  k/ c7 h+ X. \
T label
( f& l: P! u7 o$ H 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。) d/ }* W6 n9 O) l/ R- P+ R' D/ U
5 s* \8 g& a2 @# ]0 d5 _
w file
9 @$ E2 G1 G/ J3 _4 C5 S4 ? 写并追加模板块到file末尾。7 g5 F3 V; w8 c% K
( _/ y- l7 E$ a6 M$ ^
W file
- J; w( R* Y* a" a# c" |9 { 写并追加模板块的第一行到file末尾。$ [, ?) t. i7 M
% a* |+ l1 e( h5 z8 J
!
0 I1 s- p0 J  h& t. f; i+ N2 H3 T 表示后面的命令对所有没有被选定的行发生作用。
2 Y, t" d  R; M, \
9 Y0 y: I  U9 I+ m; `; b; n$ ^; Cs/re/string * G, Y6 L9 G- u6 \" }+ _
用string替换正则表达式re。# ^$ L9 B, w$ [0 ^6 P4 @
# {- F2 N$ m' d
=
3 o$ n9 i0 r2 n0 {  N4 i 打印当前行号码。
- r& L3 h1 V& }$ b 2 M' N( U' X0 }  [
#
5 Q. `" H2 i) ~0 E  d: |0 R 把注释扩展到下一个换行符以前。
1 I3 p; ]6 {( c& D) k
2 v: m/ k3 d# L4 m/ b5 u以下的是替换标记% l4 ]0 Q: }0 e5 H! R8 D' N
  d" q* A; U: \3 z" }% P. J
g表示行内全面替换。4 Q, f# g2 o! m$ ^. C1 _; t

/ p" }0 L  \# @, A( _$ kp表示打印行。
. f. \; }( `% F 1 T/ p2 ~) i% s6 X. B" ]4 i
w表示把行写入一个文件。: P; U" T0 g6 l, ]; h
9 w' {7 d; T5 D
x表示互换模板块中的文本和缓冲区中的文本。
  g# o; Q; S0 }4 {) U' q/ t) V2 l0 y6 O- y
, @, ?2 J# K6 `) cy表示把一个字符翻译为另外的字符(但是不用于正则表达式)) R! [: `: i2 ~" ?8 ~# H3 }
1 ]/ }1 K1 V! R# p* A
linux

本版积分规则

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

GMT+8, 2025-4-28 04:37 , Processed in 0.049721 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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