轉載地址:http://tanxin.blog.51cto.com/6114226/1208944
txweeds
Shell指令碼之sed詳解
一, 基本概述
(1)基本介紹
sed是一款流編輯工具,用來對文字進行過濾與替換工作, sed透過輸入讀取檔案內容,但一次僅讀取一行內容進行某些指令處理後輸出,sed更適合於處理大資料檔案。
(2)工作原理
sed在處理文字檔案的時候,會在記憶體上建立一個模式空間,然後把這個檔案的每一行調入模式空間用相應的命令處理,處理完輸出;接著處理下一行,直到最後。
(3)與vim的區別
vim需要通知處理檔案的哪幾行才會去處理,sed預設會處理檔案的所有行,除非你告訴它不處理哪幾行。
二, sed的基本語法
(1)sed [選項] [定址commands] [inputfile]
關於定址:
定址可以是0個、1個、2個;通知sed去處理檔案的哪幾行。
0個:沒有定址,處理檔案的所有行
1個:行號,處理行號所在位置的行
2個:行號、正規表示式,處理被行號或正規表示式包起來的行
(2)
選項:
--version 顯示sed版本hao
--help 顯示幫助文件
-n 關閉預設輸出,預設將自動列印所有行
-e 多點編輯,允許多個指令碼指令被執行。
-r 支援擴充套件正則+ ? () {} |
-i 可以修改原檔案,慎用!
-f 支援使用指令碼
命令:
p列印行
d 刪除行
s 替換
n替換第幾個匹內容
w另存為
a 之後新增一行
i 當前行之前插入文字
y 替換匹配內容
三, 實際案例講解
(1)p(與-n合用)
檢視passwd檔案的1~3行
@1,列印一到三行
[root@tx3 ~]# cp /etc/passwd /t1
[root@tx3 ~]# cat -n t1 | sed -n '1,3p'
1root:x:0:0:root:/root:/bin/bash
2bin:x:1:1:bin:/bin:/sbin/nologin
3daemon:x:2:2:daemon:/sbin:/sbin/nologin
@2,檢視passwd檔案的lp~halt行
[root@tx3 ~]# cat -n t1 |sed -n '/lp/,/halt/p'
5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6sync:x:5:0:sync:/sbin:/bin/sync
7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8halt:x:7:0:halt:/sbin:/sbin/halt
@3, 列印基數行(從第一行開始,每隔一行一輸出)
cat -n t1 | sed -n '1~2p'
@4,列印uid是0或1的行
[root@tx3 ~]# sed -n '/x:[01]:/p' t1
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
(2)d 刪除
@1,刪除第一行
cat -n t1 |sed '1d'
@2,刪除第一行和第三行(與-e選項合用)
cat -n t1 |sed -e '1d' -e 3d
@3,;選項的使用和-e一樣
cat -n t1 |sed '1d;3d'
@4,取反:!
[root@tx3 ~]# cat -n t1 | sed '1!d'
1root:x:0:0:root:/root:/bin/bash
(3)s 查詢替換 s///
語法:
'[address]s/pattern/replacement/flags'
old new
flags:
n:1-512 之間的正整數,表示替換模式裡面出現的第幾次內容
p:列印
g:全域性修改
w:另存為
這幾個選項是可以複合使用的,但是寫的要有意義。(pg ;nw)
注:這裡為部分擷取
@1預設會替換行裡面的第1個匹配
[root@tx3 ~]# sed 's/root/ROOT/' t1
ROOT:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
@2全部替換
[root@tx3 ~]# sed 's/root/ROOT/g' t1
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
@3替換第2個匹配
[root@tx3 ~]# sed 's/root/ROOT/2' t1
root:x:0:0:ROOT:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
@4列印
[root@tx3 ~]# sed 's/root/ROOT/p' t1
ROOT:x:0:0:root:/root:/bin/bash
ROOT:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin‘
[root@tx3 ~]# sed -n 's/root/ROOT/p' t1
ROOT:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/ROOT:/sbin/nologin
@5另存為
[root@tx3 ~]# sed -n 's/root/ROOT/w /tx' t1
[root@tx3 ~]# cat /tx
ROOT:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/ROOT:/sbin/nologin
@6在檔案的每行前面新增 # 註釋
[root@tx3 ~]# sed 's/^/#/' t1
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
@7刪掉檔案的第1個字元
[root@tx3 ~]# sed 's/^.//1' t1
oot:x:0:0:root:/root:/bin/bash
in:x:1:1:bin:/bin:/sbin/nologin
aemon:x:2:2:daemon:/sbin:/sbin/nologin
@8刪掉檔案的第2個字元
[root@tx3 ~]# sed 's/.//2' t1
rot:x:0:0:root:/root:/bin/bash
bn:x:1:1:bin:/bin:/sbin/nologin
(4)i 從當前行插入
在第一行前插入hello
[root@tx3 ~]# sed '1i hello' t1
hello
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
(5)a 從當前行後新增
在第一行後新增hello
[root@tx3 ~]# sed '1a hello' t1
root:x:0:0:root:/root:/bin/bash
hello
bin:x:1:1:bin:/bin:/sbin/nologin
(6)-r 支援擴充套件正則
[root@tx3 ~]# sed -r 's/^(.)(.)/\1/' t1
rot:x:0:0:root:/root:/bin/bash //相當於把前兩個字元替換成第一個字元,這樣就實現了刪除第二個字元
bn:x:1:1:bin:/bin:/sbin/nologin
demon:x:2:2:daemon:/sbin:/sbin/nologin
其他方法:
@1#sed 's/.//2' t1
@2#sed 's/^\(.\)\(.\)/\1/' t1
(7)y 替換,按照位置來匹配替換 y/// 不識別re
[root@tx3 ~]# sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' t1
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
(8)替換匹配行
@1[root@tx3 ~]# sed -n '1c ROOT' t1
ROOT
(9)q 退出
[root@tx3 ~]# sed '1q ' t1
root:x:0:0:root:/root:/bin/bash
(10)-i 可以修改原檔案
cat tx
11111111
22222222
33333333
44444444
55555555
sed -i 's/1/A/g' tx
cat tx
AAAAAAAA
22222222
33333333
44444444
55555555
(11)-f 支援指令碼
cat sed.sh
li hello
/^$/d
$a byebye
sed -f sed.sh tx
四.sed如何處理資料
PATT:模式空間,處理檔案的輸入行,處理檔案的空間,最多儲存8192位元組,相當於車間sed把流內容在這裡處理。
HOLD:保留空間,用來儲存已經處理的輸入行;最多儲存8192位元組;預設有一個空行,相當於倉庫,加工的半成品在這裡臨時儲存。
COMM:命令
h:將模式空間裡的內容,複製到保留空間裡,覆蓋原來的內容 >
H:將模式空間裡的內容,追加到保留空間裡,保留原來的內容 >>
g:將保留空間裡的內容,複製到模式空間裡,覆蓋原來的內容
G:將保留空間裡的內容,追加到模式空間裡,保留原來的內容
n:對匹配行的下一行進行處理
x:交換模式空間和保留空間的內容
(1)h;G
@1.將第一行的內容放到打三行後面
cat tx
11111111
22222222
33333333
44444444
55555555
sed '1h;3G' tx
11111111
22222222
33333333
11111111
44444444
55555555
@2.在每行的後面新增1個空行
注:1.保留空間裡預設有一個空白行。2,‘G’預設處理全域性
sed '1,$G' tx
11111111
22222222
33333333
44444444
55555555
sed 'G' tx
11111111
22222222
33333333
44444444
55555555
@3.把第1行到第4行的資料複製到第5行後面
注:1h是為了覆蓋保留空間裡的空白行
sed '1h;2,4H;5G' tx
11111111
22222222
33333333
44444444
55555555
11111111
22222222
33333333
44444444
@4. 把第1行到第4行的資料剪下到第5行後面
sed '1h;2,4H;1,4d;5G' tx
55555555
11111111
22222222
33333333
44444444
(2)n 對匹配行的下一行進行處理
cat tx
11111111
22222222
33333333
44444444
55555555
sed -n '1n;p' tx
22222222
33333333
44444444
55555555
(3)x 交換模式空間和保留空間的內容
sed '1h;3x' tx
11111111
22222222
11111111
44444444
55555555
本文出自 “tanxin” 部落格,請務必保留此出處http://tanxin.blog.51cto.com/6114226/1208944
自我總結:
sed -n '1~2p' 列印奇數行
sed -n '0~2p' 列印偶數行