1. 程式人生 > >linux命令總結:sed

linux命令總結:sed

linux命令總結

說明:

sed用於過濾和轉換文本的流編輯器

可以采用正則匹配,對文本進行插入刪除修改等操作

Sed處理的時候,一次處理一行,每一次把當前處理的存放在臨時緩沖區,處理完後輸出緩沖區內容到屏幕,然後把下一行讀入緩沖區,如此重復,直到處理完最後一行。


用法:

sed [OPTION] ... {script-only-if-no-other-script} [input-file] ...

sed [選項] ... [動作] [文件]

參數:

-n 安靜模式,取消默認輸出
-e 直接在命令列上進行sed動作編輯
-f 讀取腳本文件內sed命令處理文件
-r sed動作支持延伸的正則表達(默認只是基礎正則)
-i 直接修改文件內容(實驗時慎用系統文件)

-u 從輸入文件加載少量的數據並刷新更多的輸出緩沖區

--help 顯示幫助信息並退出

--version 輸出版本信息並退出


命令:

:label 是b和t命令的標簽,用來實現跳轉處理,名字可以隨便取(label)

= 打印當前行號碼

a\ 追加,在當前行的下一行追加文本

i\ 插入,在當前行的上一行插入文本

q 退出,與Q一樣

b label 分行到標簽,如果標簽被省略,則分支到腳本的末尾。

t label 如果從上一次做了一個成功的替代,輸入行被讀取,並且從最後一個t或T命令,然後分支到標簽,如果省略則分支到末尾。

T label 如果沒有s///從上一次成功替換輸入行被讀取,並且從最後一個t或T命令,然後分支到標簽。如果省略則分支到末尾。

c \ 用所有嵌入的文本替換所選行,換行符前面加反斜杠。

d 刪除選擇的行

D 刪除模版快的第一行

h H 復制或追加模版塊的內容到緩沖區

g G 獲取內存緩存區的內容,並替換或追加到當前模版塊文本

x 交換保留和模式空間的內容

l 以視覺上明確的形式列出當前行

n N 將下一行輸入讀取或附加到模式空間中

p 打印當前模版塊的行

P 打印莫板塊的第一行

s/// 替換匹配字符,可以使用正則

w 將當前模式空間寫入文件

W 將當前模式空間的第一行寫入文件

! 表示後面的命令對所有沒有被選定的行發生作用

# 把註釋擴展到下一個換行符以前

sed替換標記

g 表示行內全面替換
p 表示打印行
w 表示把行寫入一個文件
x 表示交換莫板塊中的文本和緩沖區中的文本
y 表示把一個字符翻譯成另外的字符
\1 子串匹配標記

& 已匹配字符串標記

sed 元字符集 :
^ 匹配行開始

$ 匹配行結束

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

* 匹配0個或多個字符匹配所有模塊是一個或多個空格後緊跟sed的行

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

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

\(..\) 匹配子串,保存匹配的字符,如 s/\(love\)able/\1rs loveable被替換成lovers

& 保存搜索字符用來替換其他字符,如s/love/**&**/ love這成**love**

\< 匹配單詞的開始,如 /\<love/匹配包含以love開頭的單詞行

\> 匹配單詞的結束,如/love\>/匹配包含以love結尾的單詞的行

x\{m\} 重復字符x,m次,如 /0{5\}/匹配包含5個0的行

x\{m,\} 重復字符x,至少m次,如 /0\{5,\}/匹配至少有5個0的行

x\{m,n\} 重復字符x ,至少m次,不多於n次,如 /0\{5,10\}/匹配5~10個0的行


實例:

替換操作 :s命令

替換文本中的字符串

[[email protected] ~]# sed ‘s/aa/99/‘ aa.txt 
99  123  345 aa bb cc dd bb ee
bb 123 333 444 333 222 bb

-n 選項和p選項一起使用表示只打印發生變化的行

[[email protected] ~]# sed -n ‘s/aa/www.baidu.com/p‘ aa.txt 
www.baidu.com  123  345 aa bb cc dd bb ee

直接編輯文件選項-i,會匹配文件中每一行匹配的內容

[[email protected] ~]#sed -i ‘s/aa/888/g‘ aa.txt   #全面替換標記g
[[email protected] ~]# cat aa.txt 
888  123  345 888 bb cc dd bb ee
bb 123 333 444 333 222 bb

當需要從第N出匹配開始替換時,可以使用/Ng:

[[email protected] ~]# echo ababababababab | sed ‘s/ab/AB/2g‘
abABABABABABAB
[[email protected] ~]# echo ababababababab | sed ‘s/ab/AB/3g‘
ababABABABABAB
[[email protected] ~]# echo ababababababab | sed ‘s/ab/AB/4g‘
abababABABABAB
[[email protected] ~]# echo ababababababab | sed ‘s/ab/AB/5g‘
ababababABABAB

以上命令中/在sed中作為定界符使用,也可以使用任意的定界符,例如使用#號將輸出內容轉換成大寫,其中的U在元字符裏是大寫大意思,&代表已匹配的字符。

[[email protected] ~]# echo abcd |sed ‘s#[a-z]#\U&#g‘
ABCD

刪除操作:d命令

刪除空白行
sed ‘/^$/d‘ file
刪除文件的第2行
sed ‘2d‘ file
刪除文件的第2行到末尾所有行
sed ‘2,$d‘ file
刪除文件最後一行
sed ‘$d‘ file11
刪除文件中所有開頭的test的行
sed ‘/^test/d‘ file

已匹配字符串標記&
正則表達式\w+匹配每一個單詞,使用[&]替換它,&對於之前所匹配到的單詞

[[email protected] ~]# echo a b c d |sed ‘s/\w\+/[&]/g‘
[a] [b] [c] [d]

&代表前面匹配的內容然後加上後面需要替換的內容:

[[email protected] ~]# echo "202.106.0.20"|sed ‘s/202.106.0.20/&DNS/g‘
202.106.0.20DNS

子串匹配標記 \1
匹配給定樣式的其中一部分,第一個使用\1第二個使用\2,下面是截取IP和mac地址

[[email protected] ~]# ifconfig eth0|sed -n ‘s/^.*addr:\(.*\)  .*  Mask:\(.*\)$/ip:\1 mac:\2/gp‘
ip:10.0.0.4 mac:255.255.255.0

命令中第一個()內的內容匹配\1,第二個()內大內容匹配\2,依此類推
例如:[a-z]+代表任意字符後面的+是多個的意思,此處使用-r選項使用延伸的正則表達式,就不需要對特殊字符轉義了。

[[email protected] ~]# echo "aaa BBB"|sed -r ‘s/([a-z]+) ([A-Z]+)/\2 \1/‘
BBB aaa

引用
sed表達式可以使用單引號來引用,但是如果表達式內部包含變量字符串,就需要使用雙引號

[[email protected] ~]# aa=mysql;echo "this is sqlserver"|sed ‘s/sqlserver/$aa/‘
this is $aa
[[email protected] ~]# aa=mysql;echo "this is sqlserver"|sed "s/sqlserver/$aa/"
this is mysql

選定行的範圍: ,逗號
所有在模板bbb和ddd所確定的範圍內的行都被打印

[[email protected] ~]# echo -e "aaa\nbbb\nccc\nddd"|sed -n ‘/bbb/,/ddd/p‘
bbb
ccc
ddd

打印從第2行開始到第一個包含以ccc開始的行之間的所有行包括ccc:

[[email protected] ~]# echo -e "aaa\nbbb\nccc\nddd"|sed -n ‘2,/^ccc/p‘
bbb
ccc

對於aaa和ccc之間的行,每行的末尾追加www.com

[[email protected] ~]# echo -e "aaa\nbbb\nccc\nddd"|sed ‘/aaa/,/ccc/s/$/www.com/‘
aaawww.com
bbbwww.com
cccwww.com
ddd

多點編輯:e 命令

[[email protected] ~]# echo -e "aaa\nbbb\nccc\nddd\neee"|sed -e ‘1,3d‘ -e ‘s/eee/www/‘
ddd
www

上面sed表達式的第一條命令刪除1至3行,第二條命令用eee替換www,命令的執行順序對結果有影響,如果兩個 命令都是替換命令,那麽第一個命令將 影響第二個替換命令的結果

和-e等價的命令是–expression

[[email protected] ~]# echo -e "aaa\nbbb\nccc\nddd\neee"|sed --expression ‘s/aaa/MMM/‘ --expression ‘s/eee/www/‘
MMM
bbb
ccc
ddd
www

從文件讀入: r命令
file裏面的內容被讀進來,顯示在與aaa匹配的行後面,如果匹配多行,則file的內容將顯示在所有匹配行的後面sed ‘/aaa/r filename

[[email protected] ~]# echo -e "aaa\nbbb\naaa\nddd\neee"|sed ‘/aaa/r aa.txt‘
aaa
www.org
blog.com
bbb
aaa
www.org
blog.com
ddd
eee

從文件寫入:w命令

將匹配的行寫入到文件內,註意會覆蓋原文件內容

[[email protected] ~]# echo -e "aaa\nbbb\naaa\nddd\neee"|sed -n ‘/aaa/w aa.txt‘
[[email protected] ~]# cat aa.txt 
aaa
aaa

追加: a\ 命令
將www.gun.org追加到以aaa開頭的行後面

[[email protected] ~]# echo -e "aaa\nbbb\naaa\nddd\neee"|sed ‘/^aaa/a\www.gun.org‘
aaa
www.gun.org
bbb
aaa
www.gun.org
ddd
eee

在文件第2行之後追加www,centos.org

[[email protected] ~]# sed -i ‘2a\www.centos.org‘ aa.txt 
[[email protected] ~]# cat aa.txt 
aaa
aaa
www.centos.org

插入: i\ 命令

在匹配的行前面插入內容

[[email protected] ~]# echo -e "aaa\nbbb\naaa\nddd\neee"|sed ‘/^aaa/i\www.gun.org‘
www.gun.org
aaa
bbb
www.gun.org
aaa
ddd
eee

下一個 n/N 命令
:label將存儲一個標簽位置,使用N追加下一行文本到此空間,此處就有了兩行文本(aa$bb),然後使用s/\n//p替換功能替換換行符(\n),輸出aabb,b將跳轉標簽位為bb後,賦值給label。然後逐行執行語句到行尾。

[[email protected] ~]# cat a.txt 
aa
bb
cc
[[email protected] ~]# sed ‘:label;N;s/\n//p;b label‘ a.txt 
aabb
aabbcc
aabbcc

變形: y命令
把1~10行內所有abcde轉變為大寫,註意,正則表達式元字符不能使用這個命令

[[email protected] ~]# echo -e "aaa\nbbb\naaa\nddd\neee"|sed ‘1,4y/abcde/ABCDE/‘
AAA
BBB
AAA
DDD
eee

退出 q命令
打印完第10行後,退出sed

sed ‘10q‘ file

打印奇數行或偶數行

方法1,使用n命令下一行打印

打印奇數行:
[[email protected] ~]# echo -e "aaa\nbbb\naaa\nddd\neee"|sed -n ‘p;n‘
aaa
aaa
eee
打印偶數行:
[[email protected] ~]# echo -e "aaa\nbbb\naaa\nddd\neee"|sed -n ‘n;p‘
bbb
ddd

方法2,指定從第幾行開始打印,後面數字指定間隔幾行打印

[[email protected] ~]# echo -e "aaa\nbbb\naaa\nddd\neee"|sed -n ‘1~2p‘
aaa
aaa
eee
[[email protected] ~]# echo -e "aaa\nbbb\naaa\nddd\neee"|sed -n ‘2~2p‘
bbb
ddd

打印匹配字符串的下一行

[[email protected] ~]# echo -e "aaa\nbbb\naaa\nddd\neee"|sed -n ‘/ddd/{n;p}‘
eee

使用b做跳轉,當判斷字符為aaa時b就跳轉到x,此處的:x為定義的標簽,標簽後為執行的動作。匹配字符aa就跳轉到x執行動作,在aa後面添加制表符和YES,如果不為aa就不跳轉直接執行後面的s/$/\tYES/,在後面添加制表符和YES。

[[email protected] ~]# echo -e "aaa\nbbb\naaa\nddd\neee"|sed ‘/^aaa/bx;s/$/\tNO/;b;:x;s/$/\tYES/‘
aaaYES
bbbNO
aaaYES
dddNO
eeeNO
使用t做跳轉時,如果有一次成功的替換則讀入最後一個T或t命令,此處還是不太明白,有懂的大神希望留言告知。
[[email protected] ~]# echo -e "aaa\nbbb\naaa\nddd\neee"|sed ‘/^aaa/tx;s/$/\tNO/;t;:x;s/$/\tYES/‘
aaaNO
bbbNO
aaaNO
dddNO
eeeNO
使用T做跳轉時,如果有一次成功的替換則讀入最後一個T或t命令,使用取反跳轉,此處還是不太明白,有懂的大神希望留言告知。
[[email protected] ~]# echo -e "aaa\nbbb\naaa\nddd\neee"|sed ‘/^aaa/Tx;s/$/\tNO/;T;:x;s/$/\tYES/‘
aaaYES
bbbNOYES
aaaYES
dddNOYES
eeeNOYES

分析多行日誌取IP和mac地址並做統計實例:

grep -wE ‘^lease|hardware‘ $patha/dhcpd.leases|sed ‘:x;N;s/{\n//;b x‘|sed -n "s/;$//gp"|awk ‘BEGIN{print "IP""\t\t""MAC"} {print $2"\t"$5}‘ >$patha/ip_table.txt
cat $patha/ip_table.txt | wc -l > $patha/aa.txt

後期補充。。。。

本文出自 “80後小菜鳥” 博客,請務必保留此出處http://zhangxinqi.blog.51cto.com/9668428/1921804

linux命令總結:sed