一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

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

linux之sed用法

[复制链接]
发表于 2017-3-25 09:05 | 显示全部楼层 |阅读模式
sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下sed的用法2 _5 D3 M6 Q! Q- W
sed命令行格式为:
  Y$ p# n" \2 D4 C# @6 \& d/ c         sed [-nefri] ‘command’ 输入文本        
常用选项:
/ o' G  Y9 z1 E4 |) f' \+ J% A: x! G- ]        -n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
! k3 @# s; j' C- h. z4 a        -e∶直接在指令列模式上进行 sed 的动作编辑;
; T% i( t: h7 p; g0 R7 Y+ V3 p, b        -f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
, X  [& @( w1 Q' f6 y* g        -r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
" _1 [$ Q& T" z2 o* m/ R* {        -i∶直接修改读取的档案内容,而不是由萤幕输出。      
常用命令:9 A: {* x+ J. J. }' k. Q0 r
        a   ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
1 E' L: R/ h2 _8 h8 k- v        c   ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!' R7 u$ W$ p8 c) Q" T. Z0 x* K6 ^
        d   ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;! t8 V5 |! \2 H  q( M+ _9 ?
         i   ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
, C* ^0 Q7 }8 G4 [         p  ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
& x4 B# U/ h' a! P, U         s  ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
举例:(假设我们有一文件名为ab)
& P6 D8 |4 I" x2 n: M3 R5 y$ g     删除某行. M5 F! Q- I7 p, |7 d
     [root@localhost ruby] # sed '1d' ab              #删除第一行
) J' c: O% ?8 E0 [7 c     [root@localhost ruby] # sed '$d' ab              #删除最后一行
' |! x  O8 T3 U( @8 H9 R* S, W     [root@localhost ruby] # sed '1,2d' ab           #删除第一行到第二行. `' n- s2 M' o
     [root@localhost ruby] # sed '2,$d' ab           #删除第二行到最后一行
  显示某行
5 X. A- N0 S# z) P& y1 D2 o.    [root@localhost ruby] # sed -n '1p' ab           #显示第一行
- g' ]5 ?% t- t, r* B     [root@localhost ruby] # sed -n '$p' ab           #显示最后一行
; U- U% ^$ u1 l3 ^     [root@localhost ruby] # sed -n '1,2p' ab        #显示第一行到第二行
, l: V- H$ Q1 ~% l     [root@localhost ruby] # sed -n '2,$p' ab        #显示第二行到最后一行
  使用模式进行查询
0 m2 Y* ~& j: d2 W$ O2 L: R( s7 m     [root@localhost ruby] # sed -n '/ruby/p' ab    #查询包括关键字ruby所在所有行) [% D4 M. j% v8 }$ ?7 u, C/ e
     [root@localhost ruby] # sed -n '/\$/p' ab        #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义
  增加一行或多行字符串
  h8 M- H8 o# v. m3 Q2 y3 e- u     [root@localhost ruby]# cat ab
+ }' n, J. j5 H+ A5 c( m/ I     Hello!2 }. p" b& O1 q, [
     ruby is me,welcome to my blog.
& R- P( e3 s2 o- t2 x8 k& Y: s     end
" V; |$ t2 T% d9 C' ]8 \  e     [root@localhost ruby] # sed '1a drink tea' ab  #第一行后增加字符串"drink tea"
+ ~+ J; F( i' r6 T0 x( {$ ~( b     Hello!9 c& s3 g9 L# T
     drink tea6 D5 g! E6 l2 }+ W# h( M8 h
     ruby is me,welcome to my blog.
: K5 h* p1 R! H( V+ Y     end7 G: _! f- z, \$ |% l# b; [
     [root@localhost ruby] # sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea"5 d/ I6 w5 i) ]2 Q( A# G5 E
     Hello!( s& Z6 |1 r# \2 V0 Y8 j0 w
     drink tea9 L6 m6 R( ^+ B1 S5 o0 O2 y$ D
     ruby is me,welcome to my blog.$ ?7 P0 J1 x. e! m# {, v$ |
     drink tea
+ Y% I# v. g, {2 h     end$ i5 Q# j1 I5 Z  g- p
     drink tea
" q) |# T/ {% n0 {2 j     [root@localhost ruby] # sed '1a drink tea\nor coffee' ab   #第一行后增加多行,使用换行符\n
3 p8 a3 h! [7 P     Hello!6 m  i/ f; l0 K
     drink tea0 h# E: |) o; @( T9 J: ]
     or coffee! D8 V( g" J6 M1 ~- a0 Y
     ruby is me,welcome to my blog.5 s- L( q- J' e0 C
     end
  代替一行或多行- s- [7 R# l2 B0 U: F% H* @
     [root@localhost ruby] # sed '1c Hi' ab                #第一行代替为Hi
- y' c, R3 H: T6 \     Hi
7 C9 g9 x- m4 B# Q* Y7 @  T: x3 n     ruby is me,welcome to my blog.
+ R6 o* @7 {1 \( q8 O     end
# W; U" b8 _, z     [root@localhost ruby] # sed '1,2c Hi' ab             #第一行到第二行代替为Hi: [* ]4 k9 g5 b4 {% w
     Hi
" A6 f% E4 Q/ P1 S     end
  替换一行中的某部分
9 r) ~/ Y* K3 M1 U* X  格式:sed 's/要替换的字符串/新的字符串/g'   (要替换的字符串可以用正则表达式); m1 G$ G" {- O4 V, V
     [root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby/bird/g'    #替换ruby为bird
$ k0 z7 o, {8 I0 o# G, Q. }   [root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby//g'        #删除ruby
     插入
3 w/ I8 _7 u, s     [root@localhost ruby] # sed -i '$a bye' ab         #在文件ab中最后一行直接输入"bye"+ c! ]8 h9 H+ O/ T* H
     [root@localhost ruby]# cat ab9 o! k, n7 ~' ]% Y1 U. |$ C
     Hello!! L% U6 ~! v6 ~6 Q
     ruby is me,welcome to my blog.
3 S- L! k3 @( [- C' E     end& m$ @6 t# {. j" w: F0 d
     bye
     删除匹配行
      sed -i '/匹配字符串/d'  filename  (注:若匹配字符串是变量,则需要“”,而不是‘’。记得好像是)
      替换匹配行中的某个字符串
      sed -i '/匹配字符串/s/替换源字符串/替换目标字符串/g' filename

4 _" t) ^- D3 k  Z' r1 v% I

3 Q7 V  {5 q' T! P+ _9 c& V! H: W9 z: N2 N' N' V
# J0 s5 }2 N( o. U+ q( ?
8 q1 a6 {4 t0 T1 b. R- q. N
发表于 2017-3-25 10:09 | 显示全部楼层
sed+awk只是听说过是神器,一直没机会学习,跟着楼主学起来。谢谢楼主~~~
 楼主| 发表于 2017-3-25 10:14 | 显示全部楼层
zhixiaoyuhong 发表于 2017-3-25 10:09
$ L; @3 I' o! ^9 rsed+awk只是听说过是神器,一直没机会学习,跟着楼主学起来。谢谢楼主~~~

+ q/ y1 [! K9 |/ F( W" X客气了,大家一起来学
 楼主| 发表于 2017-4-13 11:51 | 显示全部楼层
linux sed命令详解
9 w5 y$ b* `) ^( T4 E简介, O/ x1 `/ x& M+ f) e( ?
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
2 v' T7 S# E3 n6 N
: e8 o& h3 T  F9 A; o
( `8 p5 a, ^* s
8 h. k0 G* D% m3 R$ ?sed使用参数; s: b- \# h& X4 X: @) R
复制代码. l4 b4 a) ^- @* E8 v8 G9 |/ e
[root@www ~]# sed [-nefr] [动作]
( ~* P( g/ n& @6 W; t选项与参数:3 D9 p3 G  a% R1 t: R
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。. F5 w1 `* E' J2 p
-e :直接在命令列模式上进行 sed 的动作编辑;
! e* W8 ]2 x+ x, X; e-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;% }# t) Z" j6 u* o8 N% h6 f
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)8 X2 Y( m' r4 Q* E! d
-i :直接修改读取的文件内容,而不是输出到终端。% P/ h4 W5 G, W, d( A( C4 R+ D

1 L4 H3 S1 f1 x# k9 S! j! C动作说明: [n1[,n2]]function
6 e7 D' _) O: F8 L: ]$ @) Jn1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』
/ D* \* I4 I; x# H9 |& M+ @# A/ ~# O: n/ y' ~- o
function:2 i/ ~- T1 q1 A* }; s+ Y& K
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~: g3 k2 Y7 k# K/ _7 o" y
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
7 x+ J) Y' e: s- I$ Md :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
! N# ^; A9 ^# E* n8 S+ V" ci :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);+ ?" ?( [& ?$ E' M( P# X
p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~5 O& {! w6 }- u" Y. j7 U2 v
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!& X+ y; P0 C6 p2 E- m! P  L6 S7 g
复制代码$ K& L8 ~" V: R; }4 C! T
- H: B! t3 M3 C+ }) d
0 h5 f, {( H5 E" r9 n3 D8 _
以行为单位的新增/删除
! Z3 v9 @/ k7 C9 W( I  T7 N- N3 F( ~5 S+ @2 G/ J8 H
将 /etc/passwd 的内容列出并且列印行号,同时,请将第 2~5 行删除!
. J6 s( c- y6 @( F6 Y
. ]* v: k; C+ L[root@www ~]# nl /etc/passwd | sed '2,5d'
# j' B$ L" b# o% N! _1 root:x:0:0:root:/root:/bin/bash( A8 {" P+ w# L! u- o* H5 @1 k
6 sync:x:5:0:sync:/sbin:/bin/sync
3 p; ]7 l) `$ E7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown+ A- d7 P% b7 }) Q# v
.....(后面省略).....8 B- C# W: F2 G4 b* q3 X. N6 m) b

7 a5 q2 G; G3 C8 B/ H- B7 qsed 的动作为 '2,5d' ,那个 d 就是删除!因为 2-5 行给他删除了,所以显示的数据就没有 2-5 行罗~ 另外,注意一下,原本应该是要下达 sed -e 才对,没有 -e 也行啦!同时也要注意的是, sed 后面接的动作,请务必以 '' 两个单引号括住喔!3 e) p  x1 [6 Y; z: }* ?8 z
5 V# L: s2 ^; W  q8 p
只要删除第 2 行7 r" i1 [5 `2 C
: W3 ^2 O8 W: n% _& u! o- j8 ~
nl /etc/passwd | sed '2d' ( J& c6 \9 p3 i4 q% v) a8 G

" @% W/ z! I7 L9 d4 j; [) k' |% u4 n2 @* F& s0 B' g" l2 {! E
要删除第 3 到最后一行# t. C, j( R  r+ g3 J6 o3 R
4 b6 P) k1 g% V. C* e$ s% Y1 y
nl /etc/passwd | sed '3,$d' / [# ?) t6 f" J  |

2 |7 u' W# R3 j1 G6 T. F" ^* U, X$ v; c7 |/ ]" Q- j/ x
在第二行后(亦即是加在第三行)加上『drink tea?』字样!
: \4 M" ^  Y/ k# X
+ c2 m6 ~5 r6 z' u4 Z[root@www ~]# nl /etc/passwd | sed '2a drink tea', T8 @( o1 |; e; S. Q
1 root:x:0:0:root:/root:/bin/bash
5 V3 ]) q# }5 Y0 G( Y7 X2 bin:x:1:1:bin:/bin:/sbin/nologin4 b' ]3 z, _5 L' ^- E( R7 T0 F
drink tea4 b  J/ e' O6 I: Z- [9 D
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin2 e4 M3 m2 r# u  w9 y+ B& w
.....(后面省略).....
2 q, [3 q* I. Z, j6 H5 k2 j
" u6 T3 T3 n/ `  ^" Y) O/ ^$ ~8 ?- V' b2 O5 a- Z
那如果是要在第二行前
) U+ q$ M, Z; s: ~" _3 P. W8 T% y( @/ E$ @; O  R# I
nl /etc/passwd | sed '2i drink tea' $ M0 M+ W% q& j& \7 Y9 C
" ]5 L/ `3 M! o5 f8 t* ]
+ e1 g) g+ w9 r  T/ E  E
如果是要增加两行以上,在第二行后面加入两行字,例如『Drink tea or .....』与『drink beer?』
, w5 \9 c& Z5 L# A
  u3 O2 T% ]/ F复制代码+ U8 S- e1 b& O( ~. J9 v3 U& F( |/ l
[root@www ~]# nl /etc/passwd | sed '2a Drink tea or ......\, o+ l* u$ E( o# O9 j9 |
> drink beer ?'
0 Y+ i9 U" ?$ J' q1 root:x:0:0:root:/root:/bin/bash: G+ @) F' {3 _0 M
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 k3 |, W( m% }* D9 {3 Y5 X& KDrink tea or ......
; j4 g, ~1 d9 c+ h' Rdrink beer ?
& C" o' Z0 t5 a  F. B3 daemon:x:2:2:daemon:/sbin:/sbin/nologin3 |( \" d; W, ?) ~
.....(后面省略).....9 q  e/ Q  x1 @7 A
复制代码; R! R% }! H) N. P* Q
每一行之间都必须要以反斜杠『 \ 』来进行新行的添加喔!所以,上面的例子中,我们可以发现在第一行的最后面就有 \ 存在。
+ c/ |# V4 q, H, d9 i& b' p3 ~' v- w) p* `
- M% D* w+ k# S& n; B) D; B  Q
以行为单位的替换与显示$ p  j  u$ I) o( l* C/ h8 K
/ Z) n: B/ j* @3 A
将第2-5行的内容取代成为『No 2-5 number』呢?
* @6 h* `: e* V" n" u) W- u
  n/ J3 n+ n9 A% h[root@www ~]# nl /etc/passwd | sed '2,5c No 2-5 number'
2 A5 A6 S9 F3 l- x  P9 V1 root:x:0:0:root:/root:/bin/bash4 O1 ~4 E: Y( }5 d" q. g
No 2-5 number0 f. G4 s4 R1 D0 l
6 sync:x:5:0:sync:/sbin:/bin/sync3 E7 U: W1 z3 Y& x2 Q
.....(后面省略).....
" v+ \  G$ v  K& X$ q: y7 m# u
: F! X0 n* w( Q. j0 \透过这个方法我们就能够将数据整行取代了!
4 d: l1 Z/ f- g: d& m' W: L$ t) O4 J  w6 s: i! T

. d5 l% P: N1 C- q/ a. ~) H
; O  D+ m$ J) C$ |4 F仅列出 /etc/passwd 文件内的第 5-7 行5 L1 M" f4 i/ [/ Y1 E& }

7 a! J4 s0 @. B4 u+ h1 c# i[root@www ~]# nl /etc/passwd | sed -n '5,7p'
* p9 d; v, V2 ^5 [& z  v4 x5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin0 E7 V# H7 Q2 t  w. j5 c
6 sync:x:5:0:sync:/sbin:/bin/sync% U5 H% l1 n4 Q0 u0 v* p2 B8 H
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
4 |# k& ~. u( @3 r/ x& M, D可以透过这个 sed 的以行为单位的显示功能, 就能够将某一个文件内的某些行号选择出来显示。5 G2 s1 k2 ?+ k4 u* b5 ]2 x

2 f9 p# K* n2 ?* P8 M, Q/ ?
5 [) u5 [- E1 a  @# S1 N0 q数据的搜寻并显示$ g9 [+ C# o. T+ r
搜索 /etc/passwd有root关键字的行
, b! R! P) C9 @  q! t2 l4 }' U1 _3 a; }' r% H' H% k
复制代码
0 v: F. M* Y4 N% Pnl /etc/passwd | sed '/root/p'
5 K- M! {! q, b/ t) e6 f8 X) X1  root:x:0:0:root:/root:/bin/bash
# I; R: l( \6 Q+ i& G1  root:x:0:0:root:/root:/bin/bash
* l( K5 H- g, T4 n2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh& J7 ]$ l4 M: K" s* L; [
3  bin:x:2:2:bin:/bin:/bin/sh
! u) B6 `1 L: x" c+ x4  sys:x:3:3:sys:/dev:/bin/sh, @2 y1 p7 h4 c( k# {+ A+ ~
5  sync:x:4:65534:sync:/bin:/bin/sync
7 L( g# o* K) _+ v- ?* v% f....下面忽略
8 \/ E, z: k9 C5 X% q/ f复制代码
/ X0 ]# F7 q% {+ i5 A如果root找到,除了输出所有行,还会输出匹配行。3 e" |* F' N# x

+ n+ q& z! v* ~4 Z 6 y5 t! D/ Q6 P% n: R) w+ M8 _
+ Q/ X4 K& h- G3 L1 g, F* `0 Y8 N
使用-n的时候将只打印包含模板的行。
& Q, U: E, z, y: ?+ r, C* Z- p- i: l, ?; g! j7 Y" V0 v
nl /etc/passwd | sed -n '/root/p'2 R9 A7 d; ~. X- F5 X5 R# H
1  root:x:0:0:root:/root:/bin/bash
  p9 Y- D7 B/ i8 i5 y6 h : S' U1 A0 ^" x: _1 ^. |5 i8 S/ x3 _

& N1 _" h% r+ m9 s" a1 q数据的搜寻并删除
7 d4 h, ^+ b# o删除/etc/passwd所有包含root的行,其他行输出
" U5 c, j/ l( `8 x8 @
8 x' \4 c$ |: vnl /etc/passwd | sed  '/root/d'
- O: |) {. |# K) c3 F8 t. M2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh
3 `7 `4 \2 ~0 [* P& m* ]3  bin:x:2:2:bin:/bin:/bin/sh" E0 j  f4 v6 ]' q$ M* Y1 A8 w
....下面忽略  \" N1 v, W  E" }3 x/ W
#第一行的匹配root已经删除了
- }& ]& K1 ]2 {! C 4 }% o8 @$ Z; a3 c

+ R# e5 L- `( t4 W1 b6 z, | 4 u$ l$ \( B2 u# n5 ?. T
4 d! ^6 S% }5 Y, J* L
4 h( Y6 S; r& c  [  }: }) `3 G8 j
1 J4 e- L* {% J! Q9 h4 [" ^( h+ ?
数据的搜寻并执行命令
* Q8 j3 U. H! i& i# b1 ]找到匹配模式eastern的行后,
, u9 D$ {) E* M0 Y/ g* w5 L  Q$ ^4 d# b% z
搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行:* b0 h! G- `1 Z8 X  {
2 Q) J9 f6 f) d! W5 {1 M
nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p}'
3 n) K8 L8 V+ ~  ] 1  root:x:0:0:root:/root:/bin/blueshell% A8 o" D* b) W" z* _) H
如果只替换/etc/passwd的第一个bash关键字为blueshell,就退出  @! r2 T  q* a2 G9 s- |, v2 \
* a+ m4 _5 g/ T+ H
nl /etc/passwd | sed -n '/bash/{s/bash/blueshell/;p;q}'   
1 v$ W$ _+ a5 `( j" h1  root:x:0:0:root:/root:/bin/blueshell
2 }8 g+ e' ~1 ]最后的q是退出。! X: D# T4 x! V$ x( V  t( A

6 K) ^" q6 t/ t$ Y5 Q8 f
2 U0 L8 P& p; S8 H+ O4 o/ o9 D- i% E9 \+ @- o) C: A
数据的搜寻并替换$ a2 O( }" {+ r
除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代。基本上 sed 的搜寻与替代的与 vi 相当的类似!他有点像这样:2 r. p% I; U! r

1 n9 ?- g2 W; v+ e) J: G8 O  Y/ @0 _+ v3 Psed 's/要被取代的字串/新的字串/g'9 e+ E' `4 Z3 d5 s
! [4 A  l; v% p

. N$ c* }* z5 K4 T, S9 M; W先观察原始信息,利用 /sbin/ifconfig 查询 IP
7 Q: z& b& A# g' N! }) r$ P) S
[root@www ~]# /sbin/ifconfig eth0
& f9 E: {  A9 E1 R, G2 Ceth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84
, I5 j- ^+ u# Y; binet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
7 Z% ^3 ~9 C) A+ D: ^inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link
* U6 H) W* S. U; L" LUP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1, S& D% \" C5 u0 ]5 l! ?" M7 {) G
.....(以下省略).....
1 e5 }( [2 h5 w6 N% V9 L: y; c* c! p% m
本机的ip是192.168.1.100。
  D& y! G/ B; L6 W% A  r* H
8 i3 W9 _8 ~7 `. J" c, i) H
, H; }% W4 e1 C; e! A% L% R/ C. S  }( w2 q5 D; q
将 IP 前面的部分予以删除/ C/ ?  X6 r) S
9 l, Z: ]" J. ]9 D+ W" t
[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'' o+ m1 g" g7 }
192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
) |% d" }& T$ B4 V' L2 w9 q接下来则是删除后续的部分,亦即: 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0' c6 ^* s0 L8 ?$ w: i% f% z2 G+ m
: ]3 G6 L9 K) n% ^# A. P
3 Q/ j+ k" d6 v; _6 B
将 IP 后面的部分予以删除' W8 L" X, b6 l/ F4 \3 n4 `9 k
0 r, j9 o6 v, s9 o. J
[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'3 x8 R( _. y& e. D
192.168.1.100
6 N4 ]" _$ M( u' Z ' a8 o9 ~4 U* t
9 g7 ^$ r7 c- w' x7 h/ g  F5 W
多点编辑0 U  U/ Y, L2 a9 i- e8 [% F
一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell
# i: \/ ?  u3 V7 \5 n
* S0 {0 y# t* r) [: knl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
0 \* h) R! }5 z4 S5 l$ t4 p1  root:x:0:0:root:/root:/bin/blueshell! K1 M5 q. h0 U7 h. N
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh
* {% k3 n, z$ d7 r3 [& x+ [6 l-e表示多点编辑,第一个编辑命令删除/etc/passwd第三行到末尾的数据,第二条命令搜索bash替换为blueshell。
9 _7 v8 l/ X& g" B; L4 l" F1 f% Q5 A6 l1 n
% I  c( _, y; ]( G% ~
4 g& c4 A. w: I% @! t
6 E. R8 g: m3 u) a9 x

0 J: J, o4 O1 b, h+ s' T0 ?( ?# J直接修改文件内容(危险动作)
& S( }) p. V+ Q7 C& [2 ]! J7 F) }" }8 N4 E
sed 可以直接修改文件的内容,不必使用管道命令或数据流重导向! 不过,由於这个动作会直接修改到原始的文件,所以请你千万不要随便拿系统配置来测试! 我们还是使用下载的 regular_express.txt 文件来测试看看吧!# B: @. r8 Q  ^6 R" r
9 l. q$ _' C% P3 j( y3 R
利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !
! @, `$ H! [/ ?' S" B
2 l4 Z, o0 K( `4 R$ z& u1 B[root@www ~]# sed -i 's/\.$/\!/g' regular_express.txt
7 V" `/ Y* P; }0 D9 |3 f 2 M" ?5 j" ^7 ~9 k
9 Z/ R( k+ e% Z
利用 sed 直接在 regular_express.txt 最后一行加入『# This is a test』0 F: L: V( p; X' P+ O  `

' I. Q: G  y, A: U1 ?[root@www ~]# sed -i '$a # This is a test' regular_express.txt
6 n) I1 d5 Z7 g& h由於 $ 代表的是最后一行,而 a 的动作是新增,因此该文件最后新增『# This is a test』!
* m9 y; H" S3 K4 r" U( @; ^6 @
6 F. y( }4 ~" s! G! g6 Xsed 的『 -i 』选项可以直接修改文件内容,这功能非常有帮助!举例来说,如果你有一个 100 万行的文件,你要在第 100 行加某些文字,此时使用 vim 可能会疯掉!因为文件太大了!那怎办?就利用 sed 啊!透过 sed 直接修改/取代的功能,你甚至不需要使用 vim 去修订!2 @7 B- x2 L3 ~, s' x

: Z: N0 T1 z7 S7 y' n* s
copycode.gif
 楼主| 发表于 2017-4-13 11:57 | 显示全部楼层
- G, T; i% [& G9 C# ~
1. Sed简介
4 T( D" J1 f3 |) R- d
' K9 e3 w2 E/ J2 Q% I$ q4 ased是一种在线编辑器,,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。以下介绍的是Gnu版本的Sed 3.02。
# P1 F; I  c. y5 \& I7 v4 A2 {* v' r
5 {: v* Y. @6 m$ Z, B方法1:$ V8 o& G9 `' n/ t+ {: v' N
sed -i 's/被替换的内容/要替换成的内容/' file$ X8 U0 p, h! f) v5 @" Y

3 Q7 ^& d8 e% v1 f9 v方法2:8 Z7 L  O: ?2 A& Q; H
sed 's/被替换的内容/要替换成的内容/g' file > file.out9 ~  e* q+ p7 O4 u0 R
mv file.out file
+ {. M7 f# C8 k3 x& } 1 M0 v1 J+ y5 ^$ E& I' B6 J% g
这里注意:# x. P/ [, I3 p
不能这样做:
9 z3 Z. v/ d' K& m3 c sed 's/被替换的内容/要替换成的内容/g' file > file. \5 R% s; ]+ C# J
这样只会清空源文件。  G/ C5 b0 l4 C; P  _# C
+ N* W; b. }4 s! r: v+ f

  Y, F. ~( D; i  U1 s; x1 n* X: v2. 定址
  F% D4 ^  g4 t. F) c 3 f9 }0 o7 H) p, I( n
可以通过定址来定位你所希望编辑的行,该地址用数字构成,用逗号分隔的两个行数表示以这两行为起止的行的范围(包括行数表示的那两行)。如1,3表示1,2,3行,美元符号($)表示最后一行。范围可以通过数据,正则表达式或者二者结合的方式确定 。
& F* u3 `1 M* [& o1 ^/ }4 n
2 U7 E1 g; a# I: }0 Q) e# _" y) ^  _( W
3. Sed命令
* a. ~% @  Q0 u 7 V) P2 I; C, M5 G' Z" q" G
调用sed命令有两种形式:
( s& p8 l; P% H4 d 3 x' l" ]9 m: @! R
3 l, n3 Q8 b. z# t$ `, j; ]6 m
sed [options] 'command' file(s). `  e5 K* K2 e- w1 [7 ]; ]0 m

) o' J: H/ D1 y* k! gsed [options] -f scriptfile file(s)  m  J  R* }; b
! Z2 w0 n  t& G0 Q

9 W" [! g" T8 o; C  w<
& X, V4 T) s! v( @& _, R a\
( }4 x# ~8 P" [) j, U" i 在当前行后面加入一行文本。( V/ Y/ E. [" h: k( ~
' r& _2 j3 q# {( P0 V
b lable ; I% [9 p. t, G, H$ t) k8 g
分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
2 `) {6 ^6 h/ \2 X 5 p& H* J1 z( T9 M" G! N
c\
" k5 |. e: T4 H2 v, [ 用新的文本改变本行的文本。
, u$ S" j. X/ P1 w0 R1 a
2 l7 t; w" k0 Y4 ]' S. y7 Ud
0 M1 _5 u9 n: S2 A0 _ 从模板块(Pattern space)位置删除行。/ I$ Z  M# W7 }2 U" }
, o  }. w' \* Z4 q: C
D   W' J4 @+ H: T- ~( ]9 ^
删除模板块的第一行。
8 Z* _1 P) Z: e5 t6 `- P9 R0 s 1 L% N- A( f) n1 T& ~2 n6 G
i\ 6 ^2 Z" h7 ]: _# w: H, d
在当前行上面插入文本。
- F$ {4 {$ }% E3 @ 8 O- }7 G5 Q! G! Z
h
% v* _2 K; o  s  ~7 z 拷贝模板块的内容到内存中的缓冲区。
. ]: x" d. ]  |
# R: f9 c! o  t5 p$ MH % `! d0 L! Y' ?0 I
追加模板块的内容到内存中的缓冲区6 _" |% Q. ]; Z3 B4 p' C
) \* j' u' }6 p1 Q
g 7 j! o4 _( n) z
获得内存缓冲区的内容,并替代当前模板块中的文本。- y; }- y2 c( X) H2 ?
8 P9 n6 F* {1 a& x; @& V
G 9 b; |; d( }: R. \
获得内存缓冲区的内容,并追加到当前模板块文本的后面。
9 O1 A3 t5 e4 g+ n* P, i
4 T9 n( q1 S% a+ O5 F' U+ al
  x- T# X+ G# W0 P# P0 I; M 列表不能打印字符的清单。
1 f. D4 H, e/ I2 R+ q 3 U& ?, J0 \, H, s# D
n - s! \) [, q0 w9 y2 Y
读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。9 ~7 X! e. k5 c8 |

' j1 K& W. Q6 m( zN 2 ~5 y2 G* `$ A
追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
& J' B& A% L5 C# X6 j/ a' {2 z" ^# d
& \: \  T& x: m7 N( o) Jp
- v4 Y! l$ [4 F+ Z 打印模板块的行。8 x1 L- ?7 d; f7 [. r

1 @7 e( O$ j/ {% h! c4 v. fP(大写) 7 I: f1 Y" f7 u4 `
打印模板块的第一行。
5 Y, Y0 d0 D# u/ F/ ^, B9 V " z( g# h! S2 K) j4 E% `' u
q , p/ Z6 ]6 v  K+ Q3 F1 b3 @
退出Sed。4 P) J  s& T$ [' S! }

+ `& F, P% Y) o& G1 Kr file . v3 ]% p# g) R: N0 O
从file中读行。% E! d5 Y2 w/ R% G

4 v% a4 e, \4 y) G: it label
4 X/ p/ \* B0 F7 c5 s if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。4 ^6 C% L' K  Y% `. W
  d& Y  d- g; R, n5 G! s9 V. e. p: b
T label
. ^0 u% c( d5 m0 o/ H 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。, h7 a# n! K1 k/ L6 W

% X* x2 e0 W9 Xw file
. x: u5 ?8 g0 l: Q 写并追加模板块到file末尾。
* p( n  F5 l" c9 C" R - j: [( k) b3 _% m
W file : k* X9 w4 N8 M8 F8 l# \
写并追加模板块的第一行到file末尾。! j4 K9 }6 G! n5 y6 ]8 @5 s+ D' H8 f

7 t5 ^8 H* ?# U2 Y! ! O6 A9 m3 s% p  }6 D$ v$ |
表示后面的命令对所有没有被选定的行发生作用。9 C* X% F4 R: L7 Q0 i8 a

* E9 m2 Q3 ^4 @+ N/ @$ o( G0 e% Ms/re/string
1 ^, y6 j3 k0 J0 O% \9 \4 z% o 用string替换正则表达式re。0 j% B8 Q0 b5 g; R0 z( s1 L
; w  g0 D; _; m
= ' R  _$ g. Z# t  }+ y8 i2 K. w
打印当前行号码。
, z" B7 r# [! [/ T( c" o2 j
! d% X) v" g+ e  D+ b4 z#
1 n7 D1 o: i) W3 k; X1 @" r( K, m 把注释扩展到下一个换行符以前。
; ^) O: q9 x& Y( A# t1 X1 t & P4 O7 s/ L( U% u! B  ?
以下的是替换标记# q% j% v2 b) y5 ?* @$ W

% g  e* C, p, L5 g+ V8 wg表示行内全面替换。1 N$ j2 h8 E' t/ s+ J

+ f  t6 ~9 c0 xp表示打印行。
, R( ?# Q. P- D% {/ l4 k. i 6 f9 [7 j( b, G% N4 i8 B6 r
w表示把行写入一个文件。
: U, w: A7 O5 B5 e
6 |; l! c- Q+ a2 O, J2 f2 Y1 vx表示互换模板块中的文本和缓冲区中的文本。$ @( C4 d% `2 h. {% P; ?

5 z( M3 }( p4 d0 N! gy表示把一个字符翻译为另外的字符(但是不用于正则表达式)
6 e% o. b* c8 u$ S$ A; y' Q  x2 n; i
linux

本版积分规则

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

GMT+8, 2024-4-24 03:04 , Processed in 0.054718 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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