Linux三劍客之一sed用法

三劍客之一sed用法


目錄:

1、sed介紹

2、sed工作原理

3、sed語法結構

4、實例演示


一、sed介紹

sed是一種流編輯器,主要針對文本行進行處理,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲“模式空間”(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。然後讀入下行,執行下一個循環。如果沒有使諸如‘D’的特殊命令,那會在兩個循環之間清空模式空間,但不會清空保留空間。這樣不斷重複,直到文件末尾。文件內容並沒有改變,除非你使用重定向存儲輸出。

主要功能爲主要用來自動編輯一個或多個文件,簡化對文件的反覆操作,編寫轉換程序等。

二、工作原理

工作原理:在內存中申請兩個個空間,分別叫做模式空間和保持空間,基本用法採用模式空間進行對每一個行進行處理,利用用戶定義的pattern對讀取到模式空間的每一進行處理並將處理結果默認打印到屏幕。高級用法使用模式空間和保持空間共同處理完成高級作業。

三、sed語法結構

Sed的基本語法爲sed [option]scripts file,具體選項、地址定界、編輯命令和處理目標文件等,另外sed取字段或其他內容時,通常採用分組替換思路解決問題,具體如下所示:

命令

選項

Scripts

File

Sed

[nefri]

地址定界

編輯命令

目標文件

選項介紹:

-n:關閉命令本身默認輸出的內容,僅輸出經過利用用戶自定義的pattern進行對pattern空間處理每一個行文本後的動作,即地址定界+編輯命令的結果。

-e:多點編輯,同時可以多每一行進行多次編輯

-f:從指定文件中讀取編輯腳本

-r:啓用擴展正則表達式

-i.bak:備份文件並原處編輯

實例演示:-n關閉默認輸出的信息

[root@centos7  ~]#ifconfig ens33|sed '/netmask/p'  #驗證默認輸出+模式匹配動作

ens33:  flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 192.168.100.129  netmask 255.255.255.0  broadcast 192.168.100.255

        inet 192.168.100.129  netmask 255.255.255.0  broadcast 192.168.100.255

        inet6 fe80::20c:29ff:fecf:ed55  prefixlen 64  scopeid 0x20<link>

        ether 00:0c:29:cf:ed:55  txqueuelen 1000  (Ethernet)

        RX packets 16075  bytes 1508980 (1.4 MiB)

        RX errors 0  dropped 0   overruns 0  frame 0

        TX packets 12329  bytes 2347525 (2.2 MiB)

        TX errors 0  dropped 0 overruns 0  carrier 0   collisions 0

[root@centos7  ~]#ifconfig ens33|sed -n '/netmask/p' #驗證關閉默認輸出

        inet 192.168.100.129  netmask 255.255.255.0  broadcast 192.168.100.255

[root@centos7  ~]#sed -i '/SELINUX=/c\SELINUX=disabled' /etc/selinux/config

[root@centos7  ~]#cat /etc/selinux/config  #利用sed關閉selinux

#  This file controls the state of SELinux on the system.

SELINUX=disabled

#     enforcing - SELinux security policy is  enforced.

#     permissive - SELinux prints warnings  instead of enforcing.

#     disabled - No SELinux policy is loaded.

SELINUX=disabled

#  SELINUXTYPE= can take one of three two values:

#     targeted - Targeted processes are  protected,

#     minimum - Modification of targeted  policy. Only selected processes are protected.

#     mls - Multi Level Security protection.

SELINUXTYPE=targeted

[root@centos7  ~]#sed -n -e '/^root\>/p' -e 's/root/rooter/gp' p

root:x:0:0:root:/root:/bin/bash                #第一個e是全文匹配出來以root開

rooter:x:0:0:rooter:/rooter:/bin/bash           行打印出來頭的  

operator:x:11:0:operator:/rooter:/sbin/nologin  #第二個e是全文再次搜索替換

#在有兩個e時,每一個e都是對全文進行操作

ifconfig  ens33|sed -n -e '2s/^.*inet //' -e '2s/ .*$//p'

192.168.100.129                       #此時同時對第2行進行模式處理並打印

命令ifconfig ens33本身默認有信息在屏幕上輸出,另外文本的每一行逐一被調度到模式空間中被定義的'/netmask/p'處理,pattern匹配到有netmask的行打印,故實例中匹配到netmask行顯示兩行,其中1行是默認輸出的信息,另外一行是經過pattern處理後打印出的信息。如若關閉默認輸出時,則只顯示pattern處理的信息。

   地址定界:

地址定界

含義

不給地址

對全文進行處理

單地址

#

指定的行

/pattern/

被此處模式所能匹配到的每一行

地址範圍

#,#

從多少行到多少行

#,+#

從多少行到加多少行

/part/,/part/

從模式所匹配到的行再到模式匹配到的行(文本中的每一行都要進入模式空間進行處理)

#,/part/

從多少行到模式所能匹配到的行

~進步

1~2

從第一行+2行,依次類推一直向上疊加,即顯示奇數行

2~2

從第二行+2行,依次類推一直向上疊加,即顯示偶數行

編輯命令:

D

刪除模式空間匹配到的行,並立即進入下一輪的循環

P

打印當前模式空間內容,追加到默認輸出之後

a[\]text

指定行後面追加文本,支持使用\n實現多行追加

i[\]text

指定行前面追加文本,支持使用\n實現多行追加

c[\]text

替換模式匹配到的行

w/path/somefile

保存模式匹配到的行到某文件

r/path/somefile

讀取文件指定的行到模式空間進行處理

=

打印模式匹配到行的行號

模式空間中匹配行取法處理

s///,s@@@,s###

查找替換,如s/1234/abcd/,查找到1234替換爲abcd,

替換標記g:全局替換 p;打印替換成功的行 w/path/TO/somefile 保存替換的行到文件中

四、實例演示:

[root@centos7 ~]#sed -n  '/^root\>/s/^/#/p' /etc/passwd

#root:x:0:0:root:/root:/bin/bash #對正則表達式匹配出來後進行進行增加#註釋

[root@centos7 ~]#sed -rn 's/(^root)/\101/p'  p

root01:x:0:0:root:/root:/bin/bash#利用擴展正則表達式對文本進行搜索替換

[root@centos7 ~]#sed -i.bak '/^# Source/i\alias  vname="vim /etc/sysconfig/network"' .bashrc   #利用正則表達式在# Source開頭的行前添加別名

[root@centos7 ~]#cat .bashrc     #驗證說明可以實現此項功能

# .bashrc

# User specific aliases and functions

alias rm=`echo rm can not use`

alias cp='cp -i'

alias vname="vim /etc/sysconfig/network"

# Source global definitions

if [ -f /etc/bashrc ]; then

  .  /etc/bashrc

fi

[root@centos7 ~]#sed -i.bak '2i\This is my  alias name' .bashrc

[root@centos7 ~]#cat .bashrc     #在第2行前增加註釋

# .bashrc

This is my alias name

# User specific aliases and functions

alias vname="vim  /etc/sysconfig/network"

descript good

# Source global definitions

alias vname="vim  /etc/sysconfig/network"

if [ -f /etc/bashrc ]; then

  .  /etc/bashrc

Fi

[root@centos7 ~]#ifconfig ens33|sed -e  '2!d;s/.*inet //;s/ .*$//'

192.168.100.129           #封號表示順序執行,除第2行的刪除繼續pattern處理

取父目錄名或取基名,選組1則是父目錄名,選組2則是基名

[root@centos7  /media/Packages]#ls |sed -r -n 's/^.*[.]([^.]+).rpm/\1/p'|sort|uniq –c                                                  #取鏡像中.rpm包的分類個數

   2000 i686

   2938 noarch

    4069x86_64

[root@centos7 /media/Packages]#cat/etc/init.d/functions | sed -r 's/[^[:alpha:]]+/\n/g'|sort|uniq –c  #取文件中的單詞個數,思路是:非單詞換行最後統計


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章