天天看點

awk和sed字元串處理速度比較與處理速度的測試方法

堅持不是勝利,堅持住才是勝利。

問題:比如現在有一需求,提取某個配置檔案裡面的ip位址,能立刻想到的就是根據字元串的規律合理的利用awk和sed來操作。

應用場景:做一套軟體時,某個配置檔案需要批量填寫或更改已經填寫好了的預設ip位址等資訊(盡管在填寫時ip位址可以簡單的從某些檔案或變量中獲得,例如在linux(centos6)等平台中可以借助source network congfig檔案的方式)。

示例:配置檔案中有這麼一段,“<porttest host="192.168.0.142" application="video/porttest" timeout="10000" />”,如何取得ip位址呢?

字元串特征,該行中有兩組數字,或5段數字,ip位址被“””括起來,可直接用awk截取第二段擷取ip位址。

方法1,使用sed:

1

<code>sed</code> <code>-n </code><code>'/porttest /{s/.*host="//;s/".*//;p}'</code> <code>.</code><code>/testfile</code>

方法1分析:假設隻有第一次比對隻比對到一行,否則可以用head -n或tail -n來截斷行,當然sed也有類似的功能。此處sed中采用了多個字指令,首先查找porttest的行,再将“host=””前的字元串換成空,再把“””後面的字元串換成空,再列印出來。

方法2,使用awk:

<code>grep</code> <code>porttest .</code><code>/testfile</code> <code>| </code><code>awk</code> <code>-f </code><code>'"'</code> <code>'{print $2'</code><code>}</code>

方法2分析,同字元串特征一樣,ip位址被“””括起來,可直接用awk截取第二段擷取ip位址。

處理速度測試:

2

<code>time</code> <code>sed</code> <code>-n </code><code>'/porttest /{s/.*host="//;s/".*//;p}'</code> <code>.</code><code>/test</code>

<code>time</code> <code>grep</code> <code>porttest .</code><code>/test</code> <code>| </code><code>awk</code> <code>-f </code><code>'"'</code> <code>'{print $2'</code><code>}</code>

測試結果:

awk和sed字元串處理速度比較與處理速度的測試方法

sed的速度略微大于awk的速度,原因分析,可能由于awk處理的行中增加了grep和管道操作的原因。

本着測試的單一變量原則,處理一個相同的操作來比較一下。

<code>time</code> <code>grep</code> <code>porttest .</code><code>/test</code> <code>| </code><code>sed</code> <code>-n </code><code>'s/.*host="//;s/".*//;p'</code>

awk和sed字元串處理速度比較與處理速度的測試方法

在多次測試的情況下,兩者基本相似,可以說是相差并不大。

是以在實際中哪種友善就使用哪種,哪種熟練就使用哪種。

補充:sed使用正規表達式較多,擅長行處理,awk擅長列處理,更多用法可以參考《awk and sed》一書。

end

繼續閱讀