一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

搜索
查看: 4545|回复: 5

linux之sed用法

[复制链接]
发表于 2017-3-25 09:05 | 显示全部楼层 |阅读模式
sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下sed的用法
8 c# @! M0 ~5 fsed命令行格式为:5 q6 y# {6 d) I8 u0 v2 B, p* G
         sed [-nefri] ‘command’ 输入文本        
常用选项:& R  t6 Q- ~) k7 g$ Z% M5 M
        -n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
+ W  F/ l" C' W9 E- ?! x( a: s        -e∶直接在指令列模式上进行 sed 的动作编辑;
' Y# Z' {/ {; n- B& g2 w, W        -f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
+ _9 D5 {' {& L9 w% ~        -r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)- J4 n0 x+ y7 [% }
        -i∶直接修改读取的档案内容,而不是由萤幕输出。      
常用命令:
7 B! z7 V* d4 _$ ~4 A" m        a   ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~3 y0 `0 ~7 P0 T
        c   ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!+ e+ S& T% o6 N7 Y4 H* I
        d   ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
  b! r5 J- u$ {/ h         i   ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
) a& ~. R; `; C3 u         p  ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~" p& H7 Y7 D: W- n
         s  ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
举例:(假设我们有一文件名为ab)3 d, D( r$ y* g/ d' p
     删除某行: n3 @7 r/ Z9 P& z# ~
     [root@localhost ruby] # sed '1d' ab              #删除第一行
) k; p7 j/ D& x; D6 H     [root@localhost ruby] # sed '$d' ab              #删除最后一行
7 J, r. J! s0 o. R) j     [root@localhost ruby] # sed '1,2d' ab           #删除第一行到第二行! F/ p* m4 ~* [# B+ w
     [root@localhost ruby] # sed '2,$d' ab           #删除第二行到最后一行
  显示某行
; W! e, [9 y  j.    [root@localhost ruby] # sed -n '1p' ab           #显示第一行
, X, K1 V, ^! _2 m% X     [root@localhost ruby] # sed -n '$p' ab           #显示最后一行$ {. n6 v! d2 ?( R( C
     [root@localhost ruby] # sed -n '1,2p' ab        #显示第一行到第二行2 v  `# u( k$ [
     [root@localhost ruby] # sed -n '2,$p' ab        #显示第二行到最后一行
  使用模式进行查询6 P. `* ?6 A& q4 @
     [root@localhost ruby] # sed -n '/ruby/p' ab    #查询包括关键字ruby所在所有行' i1 W/ l" Y/ r9 F
     [root@localhost ruby] # sed -n '/\$/p' ab        #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义
  增加一行或多行字符串
( k6 L3 w! T' h7 M2 B) `& S     [root@localhost ruby]# cat ab
2 M* i1 v# Z/ ]) w, ]5 @     Hello!: c) |+ A; T9 ~
     ruby is me,welcome to my blog.
0 X7 C4 i; V! z* }2 B0 ]     end
2 F+ M; x' z: `+ K, L# Z0 @; I     [root@localhost ruby] # sed '1a drink tea' ab  #第一行后增加字符串"drink tea"
( a8 a% A+ W5 Y     Hello!6 _3 o9 M" D9 G: h
     drink tea2 p9 R+ O5 L' p* j) E9 z. j' B. \# z
     ruby is me,welcome to my blog. 8 _% L$ [- t3 J3 J' w; T8 l  c: C
     end  o0 ^6 D9 S! v9 w5 j  F' W
     [root@localhost ruby] # sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea"0 @1 h* `& S0 @) X& f
     Hello!
; L- u0 {0 i3 z. m' C' I     drink tea# l" N- [5 l, l7 X
     ruby is me,welcome to my blog.) C$ P! F9 s, g' \
     drink tea
/ d7 G% X0 q2 V& r9 h" M  w) b- I     end
% K( B' a; T+ Q; n* p) _     drink tea
: _. J$ x, i1 V1 R     [root@localhost ruby] # sed '1a drink tea\nor coffee' ab   #第一行后增加多行,使用换行符\n  |) }2 s  d- N) w& L+ A. b- W( o
     Hello!
' M$ q7 P8 u& I; N* M# \: G9 [! A     drink tea: n. y9 S0 z: r* a8 V2 W% v" M
     or coffee
% F- v2 q4 ^& q4 b7 h     ruby is me,welcome to my blog.
9 Z' |2 u2 j: e1 N     end
  代替一行或多行8 a6 Y$ d& v' p* _+ W) E
     [root@localhost ruby] # sed '1c Hi' ab                #第一行代替为Hi9 S6 B/ q* }$ F& m3 f, w
     Hi% p% @) V+ U% b8 v/ x' D
     ruby is me,welcome to my blog.& r3 B. \, V% f1 ~6 e# O0 N' y) ?
     end
. e( L8 k: J8 j2 n5 c, k     [root@localhost ruby] # sed '1,2c Hi' ab             #第一行到第二行代替为Hi6 y3 G5 l/ R( \; c0 G1 }
     Hi
) p+ F8 J  e( G, X4 W     end
  替换一行中的某部分
+ v, f- ?7 h' \) g; L% c  格式:sed 's/要替换的字符串/新的字符串/g'   (要替换的字符串可以用正则表达式): H6 p7 b' Z' x% X7 ^
     [root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby/bird/g'    #替换ruby为bird" q" L4 A4 l% y4 g
   [root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby//g'        #删除ruby
     插入
- D) _/ E) B; I; Q2 b- Z     [root@localhost ruby] # sed -i '$a bye' ab         #在文件ab中最后一行直接输入"bye"4 m  k0 m5 {% B' d
     [root@localhost ruby]# cat ab
9 T) v' U0 V. W0 K6 U     Hello!
3 q" S8 J/ L6 b# M& U. y! _     ruby is me,welcome to my blog., S$ _9 b0 Q+ [) W8 J
     end  t2 W, P# M# k! J
     bye
     删除匹配行
      sed -i '/匹配字符串/d'  filename  (注:若匹配字符串是变量,则需要“”,而不是‘’。记得好像是)
      替换匹配行中的某个字符串
      sed -i '/匹配字符串/s/替换源字符串/替换目标字符串/g' filename

5 D0 U/ t: ]# [6 q' j' s

2 ]# U: P# A% e  c' F' |
; Q( o7 n0 b$ l
. m7 ]2 g% A' \0 H) P( w) H3 `9 s( c+ j) O) @7 K
发表于 2017-3-25 10:09 | 显示全部楼层
sed+awk只是听说过是神器,一直没机会学习,跟着楼主学起来。谢谢楼主~~~
回复

使用道具 举报

 楼主| 发表于 2017-3-25 10:14 | 显示全部楼层
zhixiaoyuhong 发表于 2017-3-25 10:09
9 y$ ?5 m' I  {7 |- R, dsed+awk只是听说过是神器,一直没机会学习,跟着楼主学起来。谢谢楼主~~~
  U- m1 ]/ N. S, L2 f
客气了,大家一起来学
回复

使用道具 举报

 楼主| 发表于 2017-4-13 11:51 | 显示全部楼层
linux sed命令详解
) \# |$ n& B; Q$ `2 }$ L( p7 M( V简介  h( L3 T/ T$ G2 u) |; P+ G& p! d
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。% ]4 g; w/ b7 d) l3 L  a
# {( X4 t& F; G4 }. Q$ \

7 t8 o" i4 I' I. ^' u! {$ I: `. e) @
sed使用参数
, v/ Z' x0 g$ P- Q5 [. `& A复制代码0 S& v/ H0 _# |
[root@www ~]# sed [-nefr] [动作]# i$ @" u, ^# {1 P- Q/ f( n6 B
选项与参数:* n9 ]; Z% M* N: D
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
2 Q( O* v' s! X1 {-e :直接在命令列模式上进行 sed 的动作编辑;8 _: v7 ?# n8 ^4 `+ B* e5 I" `* X& K
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;: V; N8 n. q$ {8 n& S7 l# [
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)$ i& f' @& l3 h- U
-i :直接修改读取的文件内容,而不是输出到终端。
) x% l7 a* }* d5 k$ z/ @
/ z: ]5 k8 W* n$ ]+ F, [' `动作说明: [n1[,n2]]function; }0 S$ q( i2 D: [7 T3 L1 W3 T/ C* _
n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』
! w% T* a4 b0 Z! y8 i- }/ W. }: b- p" e- \# V
function:
8 U( r& e2 q+ k7 F4 ia :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
2 y0 k8 h- M1 ^; l8 Hc :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!# M# W& n; `" k
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;4 J$ q* q( [  a: g, ?
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  _1 {; |4 I5 D4 q0 N! F- hp :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~$ j3 S/ N( l/ p& L$ p
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!" Y- J7 S4 T6 T# {) q
复制代码! P% i: D2 F& x! _+ h: e! M: _

! g0 o) Y$ f2 C" l0 h0 m$ t( A3 |3 r' ]5 `
以行为单位的新增/删除" s. p; M7 d8 ~
/ z9 c! W' O9 E0 x1 R
将 /etc/passwd 的内容列出并且列印行号,同时,请将第 2~5 行删除!
% H: W. E& n5 b; W! u0 i2 m9 W$ ?3 w
[root@www ~]# nl /etc/passwd | sed '2,5d'
3 O9 W% _( U6 s, }1 root:x:0:0:root:/root:/bin/bash; L) {( d+ h8 m% |7 m2 Z
6 sync:x:5:0:sync:/sbin:/bin/sync; G+ Z8 X7 T4 y2 \; _+ ?* @
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown# `4 m* ~6 B# z. K
.....(后面省略).....# G( n/ o% N4 ~! v3 K/ T( V2 M8 @
' ?2 L4 }( ]% \- n
sed 的动作为 '2,5d' ,那个 d 就是删除!因为 2-5 行给他删除了,所以显示的数据就没有 2-5 行罗~ 另外,注意一下,原本应该是要下达 sed -e 才对,没有 -e 也行啦!同时也要注意的是, sed 后面接的动作,请务必以 '' 两个单引号括住喔!
# p, C* J7 z' l5 B( ]1 F4 ]# `: I3 y0 h2 c% R1 n4 q: R8 ^
只要删除第 2 行' j4 A' ^8 I- u1 Q) G4 b' u9 J/ k

6 H5 ~0 k. y. A5 Rnl /etc/passwd | sed '2d'
6 V. R& [. N+ I/ ]1 E' _
7 N! I5 i9 J2 H: t/ c, M
# `5 G3 Y* P6 k; W要删除第 3 到最后一行
4 \! ?+ Z2 Z0 S- Y# s  h) b# s7 C  W" ?/ G1 J
nl /etc/passwd | sed '3,$d'
" S- n* O$ d/ a7 @, ?+ b
! z6 |4 B2 Y6 \3 F
3 \, ~- ]3 k# x; z在第二行后(亦即是加在第三行)加上『drink tea?』字样!
& V3 s/ l5 i! |
! E. a, u. @5 k[root@www ~]# nl /etc/passwd | sed '2a drink tea'8 C) C& J' J+ S; l6 {
1 root:x:0:0:root:/root:/bin/bash
3 B& g5 i% d3 n# ~5 y. o4 \( g/ g1 Z2 bin:x:1:1:bin:/bin:/sbin/nologin3 m8 M  j( e$ J0 _3 R
drink tea, C* F4 _! L6 w5 u/ B3 L' |
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin& v/ \$ w: a" z. W& |
.....(后面省略).....8 c8 x: Z' n% f& _% r2 O) }2 j
6 n$ z/ o" b9 F& d2 `/ g4 N; X, J

* ^2 ?2 a% J4 r) Q$ z/ c' U那如果是要在第二行前- h. R6 x$ u! y, _: n! i" K" K
5 ^) d, {$ ^" c7 {+ p# |/ h
nl /etc/passwd | sed '2i drink tea'
9 I0 }$ J( f3 ?5 W3 P/ _' T( K ) I6 z2 {8 u7 m/ g

/ q& b6 Y8 e; M% ~, r4 W& p如果是要增加两行以上,在第二行后面加入两行字,例如『Drink tea or .....』与『drink beer?』
% i: O( d$ B) {/ ^% \9 o
7 k+ `* j  c# M复制代码; ^; z( o+ c& }8 z0 r4 z) A/ f8 p
[root@www ~]# nl /etc/passwd | sed '2a Drink tea or ......\3 D# Y; S5 i, F# a: N& G; f$ I
> drink beer ?'8 o8 u. }9 F4 s, u) e( u
1 root:x:0:0:root:/root:/bin/bash
- E& w0 z% G& P! S2 bin:x:1:1:bin:/bin:/sbin/nologin
& t1 U# Q: ~: MDrink tea or ......6 }+ _+ |0 H! F- u2 S  F  J/ U
drink beer ?; |6 e5 `8 t' L" W% J" l' U) m
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin- i6 I' W* m4 W! l
.....(后面省略).....
* a9 B# L. L$ k" c复制代码
) s8 E, |' r: W1 T每一行之间都必须要以反斜杠『 \ 』来进行新行的添加喔!所以,上面的例子中,我们可以发现在第一行的最后面就有 \ 存在。, @) A; @8 b, E9 Z; }9 i9 V
' Z0 y2 \: }: z
* l! {5 u: \- _* Q1 ?  m0 M6 h
以行为单位的替换与显示
* B9 B8 {# Q$ @) x6 C
, B- C4 g. Q7 R: z8 g  y" W将第2-5行的内容取代成为『No 2-5 number』呢?
! h2 Q3 C/ [. {1 ]
+ ]6 y3 w8 ^, [1 J% Y5 f[root@www ~]# nl /etc/passwd | sed '2,5c No 2-5 number'0 h, L6 G: \# s% D9 ^" J( z5 A! a
1 root:x:0:0:root:/root:/bin/bash$ J3 B$ T" u8 X
No 2-5 number
5 I5 y" y. w/ i% i4 n6 sync:x:5:0:sync:/sbin:/bin/sync
! [# s  R3 h9 X2 q; D.....(后面省略).....* H. w" Q- [* E2 c* E8 X/ d# \9 R
' T  k+ X( I  X/ G
透过这个方法我们就能够将数据整行取代了!
1 X; M+ t; X- T9 Q+ g, z, J" V' p+ Z: k2 k

: U* C: P" w9 P1 L0 s9 D1 U
0 C- ?3 B4 {- z, E仅列出 /etc/passwd 文件内的第 5-7 行
- c* m" Q& M. o0 d# \1 N! L3 f3 {. x  V
[root@www ~]# nl /etc/passwd | sed -n '5,7p'6 h, ~6 u9 p& n0 L1 [  R+ R. C
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
# }5 A3 i5 d0 t5 z' K6 sync:x:5:0:sync:/sbin:/bin/sync+ |/ h  V6 V" a
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
7 p$ ^! ^8 @9 b/ M$ }可以透过这个 sed 的以行为单位的显示功能, 就能够将某一个文件内的某些行号选择出来显示。
  p6 j0 H$ K- ^; F
7 d6 G# Y! u0 l5 `1 G  N8 Z+ i : s& G0 {1 s" ]7 [+ c* g/ ?: ?3 G
数据的搜寻并显示# N  B) p+ U) s. b* ?
搜索 /etc/passwd有root关键字的行
# F  E# l9 a/ s$ {% p
  m: t2 N1 M. z* A1 S复制代码$ m9 `" m6 t8 O" E- X: P
nl /etc/passwd | sed '/root/p'
7 `. l2 c8 ~) K" Z& r1  root:x:0:0:root:/root:/bin/bash! y' N: [2 {: y* _8 @& f, p
1  root:x:0:0:root:/root:/bin/bash0 |- ^/ R/ {0 y2 x
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh" }) U' s0 J. C+ H
3  bin:x:2:2:bin:/bin:/bin/sh: \9 R$ t% E5 C7 o! n. t
4  sys:x:3:3:sys:/dev:/bin/sh& F/ ~: P' y5 V8 S- n  c3 x
5  sync:x:4:65534:sync:/bin:/bin/sync7 c- U4 l0 q  B4 i! V( P6 l
....下面忽略 * [- m9 c2 l0 ^! ]7 {& `/ S
复制代码% Y. S; c8 U, o0 [2 X
如果root找到,除了输出所有行,还会输出匹配行。
& I7 n4 B# c0 G" U, [" d$ B) m

, ^  X' {# [$ O
6 T. c: |& D. l2 v使用-n的时候将只打印包含模板的行。# S- e" H# H1 S& K

, p6 c0 X% m' y9 \: x" }nl /etc/passwd | sed -n '/root/p'
8 \$ i) Q6 R. p( S- l1  root:x:0:0:root:/root:/bin/bash: _% ^; K8 V6 |: }: N+ O) j' d

5 e, Z0 O; I/ s/ _
6 K3 w* E, p# c( P+ T% ~数据的搜寻并删除6 C7 L8 f+ B# B
删除/etc/passwd所有包含root的行,其他行输出
  x7 o/ k. C# W+ z0 W
+ m1 X9 T0 j* B# a9 m% ?% r" snl /etc/passwd | sed  '/root/d'. d3 o& `9 l. W' {
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh
! [3 N0 l  e3 y" h; x9 w( t  q0 d3  bin:x:2:2:bin:/bin:/bin/sh0 m& x# _3 B9 H
....下面忽略
3 D0 Y! ^0 S9 R#第一行的匹配root已经删除了! i: G5 E; Z! R3 k' q1 S3 f+ V

8 D( h5 u9 i* j& R! X
/ q% I( T4 b) X# g
0 ]! X* C5 R$ I: q" m8 C+ F3 S# r& |) a& \+ M0 _

5 x" K/ P- P! ~  M! O9 q
: r  l# s4 a) e9 {数据的搜寻并执行命令; W+ Z1 S/ V3 y) b& ]: r
找到匹配模式eastern的行后,
2 E/ N5 G7 E, v1 ^9 a! n' V3 ^1 }5 n- R7 e1 m& z( [
搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行:
; s( y: @; @7 v- N3 @3 ], [6 H) a; x( q9 F" C
nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p}'4 c2 @, I9 G# f. X
1  root:x:0:0:root:/root:/bin/blueshell
: {# X/ s# V* c( S  l$ G如果只替换/etc/passwd的第一个bash关键字为blueshell,就退出
7 v; v: }  r: `0 o4 X& a9 s7 P( Z2 E3 U$ S, t9 Y! k. K
nl /etc/passwd | sed -n '/bash/{s/bash/blueshell/;p;q}'    ( q" z- l' c. s9 N& \- `2 C
1  root:x:0:0:root:/root:/bin/blueshell) K7 m$ p% n' v+ W; D9 \4 `
最后的q是退出。; t9 r: y9 k# x+ _
# S1 ]6 H# l2 m9 W6 |* m  B
+ ?: ]- x" w6 a: I9 F' N

4 c6 ?5 P9 y3 O4 j8 p数据的搜寻并替换: o' j. N* L, m& E
除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代。基本上 sed 的搜寻与替代的与 vi 相当的类似!他有点像这样:( f+ J( `& \, N7 w7 f. Y

" z6 m% I. M" v8 N/ Wsed 's/要被取代的字串/新的字串/g'
# h6 `7 M2 v/ U
, D/ Z2 Z' G- G' A/ i8 ]9 N% q: q. R  K5 e
先观察原始信息,利用 /sbin/ifconfig 查询 IP
$ n9 ^, Z) G( c9 U: x2 Y* N$ S1 G. [! z2 S
[root@www ~]# /sbin/ifconfig eth0' i) q8 i8 U0 K9 V3 f2 n
eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84
' U; X9 e+ ]/ Q8 B' Yinet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0! r( V! d9 ^2 `2 X. \/ W/ Z3 a
inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link, e$ ]& z: c# ]& q0 W; v
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1/ i% z( ]! B: ?' F6 G* z
.....(以下省略).....) f) \; y9 F1 L. U
$ h. \: i* ~$ f8 S
本机的ip是192.168.1.100。
) z! o, T2 A( a4 G' _  O' P7 v4 N6 s

+ Z, N( P) ~4 Z# X4 n: ]. J& D  b2 C! a0 ~; f
将 IP 前面的部分予以删除
; b! v2 W1 b! s7 r# }9 V8 v# H- E; |2 Q- G, H
[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'+ {' t/ e! N' W5 B$ O
192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
' O3 t; F6 J! n接下来则是删除后续的部分,亦即: 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0+ D4 N& b4 ], p: \2 k2 ^

. l% z! m+ h) r  ]
- `6 [  w5 e) i  v8 N- L! m将 IP 后面的部分予以删除
; q1 w  R1 Y: Y! Y( F
" r' b7 [, @" l5 P4 H; N* e4 g" q[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
0 ]6 r9 A: I, c  _$ u192.168.1.1004 {+ ?# T* \, E; O+ @

& f2 H! v5 r9 V) P
: T) l8 o- _: ^- J; [$ ]多点编辑
( _# ?- n/ [, |2 h6 s一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell
' f; W4 M$ `" W( J" |3 c+ h4 y( N
nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'( ?; z6 d1 ^3 M" I8 h/ u
1  root:x:0:0:root:/root:/bin/blueshell
$ M- g0 L8 r+ z; J4 k' d2 d2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh
% l1 }3 U7 l; d7 j- D5 \. l-e表示多点编辑,第一个编辑命令删除/etc/passwd第三行到末尾的数据,第二条命令搜索bash替换为blueshell。, Z9 R6 q7 U4 e
% M) S) ]* y/ P! x( B; _

. F5 l; e% g$ b
( {$ M2 o9 |, p: }) l: W0 y1 _ # _- R: w5 _  a: V# c% m
1 b1 G- v/ F$ W* }* k( t' |+ G# }
直接修改文件内容(危险动作)$ b8 u7 e2 }/ k. y0 Q! Q0 K# d1 H

# Z) U! n% x0 o$ z7 C( ysed 可以直接修改文件的内容,不必使用管道命令或数据流重导向! 不过,由於这个动作会直接修改到原始的文件,所以请你千万不要随便拿系统配置来测试! 我们还是使用下载的 regular_express.txt 文件来测试看看吧!1 Y$ K, Z2 `0 K6 r' m
1 d. B2 x) g: f& ?7 v
利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !- `( a1 @, w) B# c3 x
5 }2 O. I+ n7 F
[root@www ~]# sed -i 's/\.$/\!/g' regular_express.txt
6 Q7 z  t/ w8 W2 G( R( Y0 r
- Y- |/ B9 E$ W. ^3 ?) A" k( d* e& T0 Q4 t# S! G7 J
利用 sed 直接在 regular_express.txt 最后一行加入『# This is a test』7 q- W& q9 @# q6 n. Q
  {  U7 C0 A* y' F( W; d
[root@www ~]# sed -i '$a # This is a test' regular_express.txt6 P6 b* G) |$ G
由於 $ 代表的是最后一行,而 a 的动作是新增,因此该文件最后新增『# This is a test』!
' q: C! c( `) L4 F, R
1 h: ]) H8 M8 N; o8 dsed 的『 -i 』选项可以直接修改文件内容,这功能非常有帮助!举例来说,如果你有一个 100 万行的文件,你要在第 100 行加某些文字,此时使用 vim 可能会疯掉!因为文件太大了!那怎办?就利用 sed 啊!透过 sed 直接修改/取代的功能,你甚至不需要使用 vim 去修订!4 a- X  ?9 m; Q! P
9 X/ [1 ~5 c4 W9 O  G4 |$ t
copycode.gif
回复

使用道具 举报

 楼主| 发表于 2017-4-13 11:57 | 显示全部楼层
$ a6 }! W  I- ^
1. Sed简介
- d9 v4 }9 D3 V! Y1 |
+ Y8 T  y- j# ^3 @1 Ised是一种在线编辑器,,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。以下介绍的是Gnu版本的Sed 3.02。
0 D3 z+ r% y) u2 s
+ e& b; _4 Q* C; O1 N& I! l4 `方法1:+ w. O6 N- f1 z$ t: a% f% L* R
sed -i 's/被替换的内容/要替换成的内容/' file
  b) `/ Z" E0 t1 s; A ! e/ t  Z* _# \$ ^
方法2:: K2 [- x- n  F! P! |' @
sed 's/被替换的内容/要替换成的内容/g' file > file.out
! P4 Z9 K7 l' C* z4 ?8 a mv file.out file& f4 P# h+ g, c5 E7 w& O2 j7 Q2 K
" \3 E8 T, p* m* Z# s. x) Z, Z
这里注意:, @# ^/ [$ c' ?$ y# z( \
不能这样做:# F' f3 V$ s; ]: b% R& y
sed 's/被替换的内容/要替换成的内容/g' file > file
4 o; f& S  U, t! w4 ^1 s- H" [1 G 这样只会清空源文件。2 z1 Q* m; D( _6 `2 ~$ L# Y  L
& i. H) q$ c7 i2 b
: L* {' z5 v9 }4 ]( D- n6 I
2. 定址
9 {& @$ C9 P* r/ f0 { + r9 o2 D; j" H( ~6 O2 I* u/ j/ _
可以通过定址来定位你所希望编辑的行,该地址用数字构成,用逗号分隔的两个行数表示以这两行为起止的行的范围(包括行数表示的那两行)。如1,3表示1,2,3行,美元符号($)表示最后一行。范围可以通过数据,正则表达式或者二者结合的方式确定 。
* G9 O- U) F. |6 G+ o* t; T
/ y' V6 a9 w% ]+ Z: X) E" A
4 c! p; f! c; x9 L, y+ g/ Z3. Sed命令
! {7 B" E. E! f, ~' t
0 J# K0 h0 j& b调用sed命令有两种形式:
. q, U& k- m$ X7 i0 `) n+ n/ o3 \
3 m- V- f8 G7 c* x2 I9 q8 L; e
- y% i- U9 j1 ?5 g" Zsed [options] 'command' file(s)0 s4 Z  F$ j0 t& \$ j9 p

% B2 O2 O* ~+ \; P- x! t- L  |sed [options] -f scriptfile file(s)
$ D7 G+ Q" Y  H' Q% m4 Z
# ]. X: u) h; a" s5 \/ l; ]
1 f8 e1 Y- l$ Q* ?" B$ a: O<
: f  ]0 g" H! O& a' R a\
. b2 O5 G, W  J% C 在当前行后面加入一行文本。4 t% B' a: l4 s! Q1 U' S% Y

. V/ j! q2 a8 `9 u' j9 e% Ab lable
3 I4 f- t4 J/ z& _7 t 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
8 \! O" |/ T( T% p4 o
$ L- E! Y: \4 V! _- Xc\ ) N* b1 E2 l7 w  p9 [9 s
用新的文本改变本行的文本。
* g: |# H* e: | 2 c- {  {# v# _. b5 P$ h
d
7 }5 z$ }0 p' L4 n 从模板块(Pattern space)位置删除行。+ b1 v3 J2 D( s6 k* }

6 P: ?$ v# L- T% DD 0 u; N3 x/ {3 @8 B% t8 x
删除模板块的第一行。8 w) t! y& {4 W9 Q0 [8 E

% C+ L  s( \# t+ Pi\
. \8 Y; E" e; t 在当前行上面插入文本。
  @, R) K: d4 {/ R
- @( m! p! F% T6 f: @" _. E* {h , I9 `3 `- {5 V( g/ P/ T8 D
拷贝模板块的内容到内存中的缓冲区。
8 X1 b9 l( Z, y ' ]# v2 i+ k# h5 k3 N" ~7 C
H
! T0 f8 C, Q" j+ B; Q' v 追加模板块的内容到内存中的缓冲区
3 V& M  N$ U1 \ " `; H% N: |5 q5 u
g ; R. a& ~; k/ v
获得内存缓冲区的内容,并替代当前模板块中的文本。/ f; [8 ?+ s. c* \/ `6 n

3 B" r; b0 W6 P2 }' I2 pG . z& P9 T  e* _7 t( g( O
获得内存缓冲区的内容,并追加到当前模板块文本的后面。
3 m. e3 l* A& W& _7 ~% H, y& q2 ~ ' {; o( f) _; h1 Y
l
2 u& o9 C' y2 k8 b8 R# Z" a 列表不能打印字符的清单。
% V( T: T2 W' _2 m* p 2 p/ R; j$ h( G; d1 s. J3 G) ^
n
+ t/ I  F" Q3 @  z% `( P( A 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。. m3 h" F& f' n: C4 F

$ L8 @7 z& a/ L% b" F5 [3 AN
9 k* A7 d) L' u0 \" G3 H/ G 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。" b* J7 s. }* W" L  o6 e; L: T
$ s  [- K7 F/ Y* w0 C& F
p
6 v* q  a- H4 J+ w+ q6 w$ { 打印模板块的行。: ]2 h; o: z/ c7 q7 e5 c

# }5 ?. }5 r% \+ EP(大写) - C+ L' F3 D" Q! Z7 f5 i
打印模板块的第一行。
; }1 o8 r$ ^, x/ `8 k, C! ^
- ~: ?- |- i- A# R" s. l# E" v1 ^2 \, ]q
/ l, w5 Z. f; i! O 退出Sed。9 a% ^, V0 z5 P, S
* i" D; k/ L6 k9 r6 c5 t
r file
" C3 V6 ~/ H: P' b9 x 从file中读行。
( K4 t5 c& U( I! x. b+ F. h$ Z & o' q# @4 s, n8 ~4 C- q' Z
t label / \1 X# f4 U* |* l! m
if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。7 M8 y5 f) ?; x2 A% H- G- {

0 D/ J2 |5 s9 YT label , ^" p2 I* F. d) L5 C
错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
, i0 y! T& o+ I0 U. _+ V ) ]! F0 P7 A% r2 y8 r: j& U
w file
$ K1 z( C: y8 G) n& M  | 写并追加模板块到file末尾。& R( ?  q" V, @6 R) F
9 K5 |$ A  B* ]: N
W file
6 x6 S$ q3 y: Y/ | 写并追加模板块的第一行到file末尾。
% a; G, R: u7 b - A" S. B( P8 F- S3 @6 g
!
( S+ A7 }8 H9 w 表示后面的命令对所有没有被选定的行发生作用。
3 q1 W- ?4 d$ `; z2 [0 z+ c6 l 2 T; h# a; w; x
s/re/string 4 s. C% b5 _# J. _- s* _
用string替换正则表达式re。
) I& K* \: R2 K: G
& D5 s4 I, V; Z2 O= 6 \6 u: D, B# f1 V4 e7 b2 v
打印当前行号码。& d/ {# }7 P5 x% J; U: v+ t

  N( m/ F7 {, d1 _- Y1 g# ' ~( b1 |& G7 w0 h3 k7 o2 v# F3 z
把注释扩展到下一个换行符以前。
3 i& I2 ?0 ?( a$ Z0 u$ U8 z- E, L( J4 m7 V & ?/ l( n( H7 Y& O2 r
以下的是替换标记+ L( n7 u& p$ E+ j+ m
4 L0 E+ K, ~1 q) B" m, l) K
g表示行内全面替换。
$ t' S- `5 `. n/ i0 R + v1 g6 c0 R4 n
p表示打印行。$ }: G4 U4 |, ]* ?9 I# p( Z, Q  d
( T3 ~: I: A5 q' s; Z/ g! Q! j, s
w表示把行写入一个文件。
" K# S8 W; S" p' A/ z- t6 ^, @8 p: z
$ G8 z8 c0 o$ `- M* f- `x表示互换模板块中的文本和缓冲区中的文本。/ r6 p$ ]+ m2 ^$ t$ g1 T
& m9 ^7 i# @3 d) W2 @5 N
y表示把一个字符翻译为另外的字符(但是不用于正则表达式)
, h8 r1 l# l. Q* k% v
. j7 m. n  f2 a. c3 [! Elinux
回复

使用道具 举报

本版积分规则

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

GMT+8, 2025-8-20 09:00 , Processed in 0.045783 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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