三劍客之一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 #取文件中的單詞個數,思路是:非單詞換行最後統計 |