1. 程式人生 > >Linux下常用命令之sed學習總結

Linux下常用命令之sed學習總結

linux sed sed命令 正則表達式 sed總結

  • Sed功能說明:

Sed是linux下一個強大的文本文件處理工具,通過對文件增加、刪除、查找、查詢操作,配合正則表達式以實現工作中的各種需求。同時也是一名運維人員必須掌握的核心技能。

------------------------------------------------------------------------------------------------------

  • sed正則表達式:

^ 匹配行開始

$ 匹配行結束

. 匹配一個非換行符的任意字符

* 匹配0個或多個字符

[] 匹配一個指定範圍內的字符

[^] 匹配一個不在指定範圍內的字符

\(..\) 匹配子串,保存匹配的字符,給替換命令s的\N引用

& 保存搜索字符用來替換其他字符,給替換命令s的&引用

x\{m\} 重復字符x,m次

x\{m,\} 重復字符x,至少m次

x\{m,n\} 重復字符x,至少m次,不多於n次

------------------------------------------------------------------------------------------------------

  • Sed命令格式:

sed [選項] ‘範圍/命令‘ 文件

------------------------------------------------------------------------------------------------------

常用選項:

-n 只顯示匹配到的內容,通常和p參數配置使用。

-e 同時執行多個命令,另一種實現方式:‘命令1;命令2‘

-i 執行命令並實際修改文件,如果不使用此選項,sed所有的操作都只是修改內存中的值而已。

------------------------------------------------------------------------------------------------------

  • 常用範圍:

1 :匹配第1行

1,5 :匹配第1行到第5行

2,$ :匹配第2行到最後1行

1~2 :匹配基數行,2表示步進值

2~2 :匹配偶數行,2表示步進值

/string/ :匹配包含字符串的行

/[a-z]/ :匹配包含某個範圍的行

/^string/ :匹配包含元字符集的行

/正則/ :匹配正則表達式內容的行

------------------------------------------------------------------------------------------------------

  • 常用命令:

s 替換指定內容 格式:‘/範圍/s/替換內容/新內容/替換範圍‘

a\ 在行下面插入文本 格式:‘範圍a\內容‘

i\ 在行上面插入文本 格式:‘範圍i\內容‘

c\ 把選定的行改為新的文本 格式:‘範圍c\內容‘

d 刪除選擇的行 格式:‘範圍d‘

h 拷貝內容到緩沖區 格式:‘範圍h‘

G 獲得緩沖區內容並追加 格式:‘範圍G‘

p 打印文件內容 格式:‘範圍/命令/p‘

r 讀取file內容顯示在範圍後 格式:‘範圍/r file‘

w 提取範圍裏的內容到file裏 格式:‘範圍/w file‘

! 匹配與範圍相反的內容 格式:‘範圍!‘

------------------------------------------------------------------------------------------------------

  • 替換命令s常用參數:

/ 定界符 格式:‘/‘ 如果舊值包含‘/‘,[email protected]#或者|等

g 替換範圍,N表示第幾次匹配 格式:‘範圍/s/舊值/新值/Ng‘ 沒有N表示全部替換

\N 引用子串,N表示第幾個子串 格式:‘範圍/s/*子串*/\N/g‘ *表示其它內容

& 引用‘#‘的內容 格式:‘範圍/s/#/*&*/g‘ #表示匹配內容


------------------------------------------------------------------------------------------------------

正則表達式示例:

/^#/ 匹配所有以#開頭的行

/sh$/ 匹配所有以sh結尾的行

/s.d/ 匹配s後接一個任意字符接d

/s*ed/ 匹配0個或多個s接ed的行

/[0-9]/ 匹配包含數字的行

/[a-z]/! 匹配不包含字母的行

/[^a-z]/ 匹配不包含全字母的行

/\(sh\)ell/#\1#/ 匹配shell替換為#sh#

/shell/*&*/ 匹配shell替換為*shell*

/s\{5\}/ 匹配包含5個s的行

/s\{5,\}/ 匹配至少有5個s的行

/s\{5,10\}/ 匹配5~10個s的行

------------------------------------------------------------------------------------------------------

常用選項示例:

僅顯示匹配到的第1行內容 :sed -n ‘1p‘ /etc/passwd

同時執行多個命令 :sed -n -e ‘1p‘ -e ‘/mysql/p‘ /etc/passwd 或者 sed -n ‘1p;/mysql/p‘ /etc/passwd

執行命令並修改原文件 : sed -i ‘2d‘ /etc/rc.local

------------------------------------------------------------------------------------------------------

常用範圍示例:

匹配第1行 :sed -n ‘1p‘ /etc/passwd

匹配第1到5行 :sed -n ‘1,5p‘ /etc/passwd

匹配第2行到最後1行 :sed -n ‘2,$p‘ /etc/passwd

匹配奇數行 :sed -n ‘1~2p‘ /etc/passwd

匹配偶數行 : sed -n ‘2~2p‘ /etc/passwd

匹配包含mysql的行 :sed -n ‘/mysql/p‘ /etc/passwd

匹配以a/b/c開頭的行 :sed -n ‘/^[a-c]/p‘ /etc/passwd

匹配以root開頭的行 :sed -n ‘/^root/p‘ /etc/passwd

匹配5加至少2個0的行 :sed -n ‘/50\{2,\}/p‘ /etc/passwd

------------------------------------------------------------------------------------------------------

常用命令示例:

匹配包含mysql開頭的行替換登錄權限 :sed -n ‘/^mysql/s@/bin/bash@[email protected] /etc/passwd

匹配文件第1行並在行前插入###### :sed ‘1i\######‘ /etc/passwd

匹配文件第1行並在行後插入###### :sed ‘1a\######‘ /etc/passwd

匹配文件第2行並修改為###### :sed ‘2c\######‘ /etc/rc.local

匹配文件第2行並刪除內容 :sed ‘2d‘ /etc/rc.local

拷貝文件第2行並追加到最後1行 :sed ‘2h;$G‘ /etc/rc.local

讀取resolv內容追加到local最後1行 :sed ‘$r /etc/resolv.conf‘ /etc/rc.local

讀取local第3到5行內容寫到newfile : sed -n ‘3,5w newfile‘ /etc/rc.local

匹配文件不包含空行的內容 :sed -n ‘/^$/!p‘ /etc/rc.local

------------------------------------------------------------------------------------------------------

替換命令s常用參數示例:

根據實際情況修改定界符 :sed ‘s@#!/bin/sh@[email protected] /etc/rc.local

從第2次匹配後開始替換 :echo shellshellshell |sed ‘s/shell/SHELL/2g‘

提取子串並反向引用後替換 :echo test is ABc or 111 |sed ‘s/\([a-Z]\{3\}\) or \([0-9]*\)/*\2* or #\1#/‘

保留搜索到的內容並引用 :echo this is test file |sed ‘s/test/##&##/‘

------------------------------------------------------------------------------------------------------

註意:

當sed在腳本中處理替換操作時,如果新內容是引用變量,則需要把單引號修改為雙引號

示例:

name=123456

echo "####6543210####"|sed -n "s/[0-9]\+/$name/p"

------------------------------------------------------------------------------------------------------


本文出自 “該死的溫柔” 博客,請務必保留此出處http://lsong.blog.51cto.com/2432419/1922121

Linux下常用命令之sed學習總結