sed打印包含一個字符串的行到包含另一個字符串的行解答


sed命令:刪除匹配行和替換

刪除以a開頭的行

sed -i '/^a.*/d' tmp.txt

-i 表示操作在源文件上生效.否則操作內存中數據,並不寫入文件中.
在分號內的/d表示刪除匹配的行

 

替換匹配行:

sed -i 's/^a.*/haha/g' tmp.txt

分號內的s/表示替換
/g表示全局替換

 

sed -n '/字符串1/,/字符串2/p' filename  這個命令為什么有時候打印不出來想要的東西,例如:
sed -n '/root/,/adm/p'  /etc/passwd      我想/etc/passwd中包含root的行到包含adm的行,結果卻是:
# sed -n '/root/,/adm/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
xc:x:500:500::/home/xc:/bin/bash

所有行都出來了,為什么啊?

 

解答:

我來告訴你為什么。其實你如果將-n 去掉 然后看完整的數據流顯示 你就能理解為什么顯示了“看似全部的內容”
首先要明確一個重要的概念:
sed處理數據是以“數據流”的形式來進行的。sed將文件的每一行都讀取到緩存空間中進行處理,並將處理后的數據返回。

那么我們來看你這條語句是什么意思
sed -n '/root/,/adm/p'  /etc/passwd 
sed篩選每一行的數據 如果數據符合 /root/,/adm/ 這個表示式的匹配就打印出這一行的數據 由於使用了-n 那么說只有符合這個條件的行才會被打印出來。
那么我們來分析sed整個數據的處理過程。步驟如下
1.讀取每一行的數據,通過表達式進行匹配,那么輸出了root行到adm行之間的所有行。所以第一步輸出了如下內容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
2.關鍵在這里,sed雖然完成了“你想讓它完成的工作”,但sed卻不會再這里停止,它仍然要將下一行的數據繼續讀入 通過這個表示式來處理。那么sed會將后面讀取的每一行取匹配表示式/root/,/adm/ 
顯示sed在
operator:x:11:0:operator:/root:/sbin/nologin
這一行找到了root ,然后下面讀取的行 只要不包含adm 都是符合表示式的要求的 而后面顯然沒有adm的行 所以從operator一直到最后都會被打印出來。就成了你看到的樣子,這里巧的是 adm后面緊跟的就是一個包含root的行 所以很碰巧的顯示了文件的全部內容。

 

 

sed是按行處理的,不會將整個文件加載到內存中,可以放心使用
要切出從2012-02-09到2012-09-10的所有數據行,(假設你的日志文件以yyyy-MM-dd的日期格式開頭)只需要:

sed -n '/^2012-02-09/,/^2012-09-10/p' whole.log > part.log


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM