2013-12-08 34 views
0

我們都知道總有多種方法可以解決問題。我想知道在一個案例中每個特定解決方案的優點和缺點是什麼。時間和空間方面(也許乾淨 - 但這是主觀的,所以不是主要焦點)。Awk vs Awk + ​​cut vs bash

你有一個文件,也包含線,包括字符串xyz,但不完全。您對行中的整數值應滿足條件的行感興趣。

我曾經這將是從sslscan輸出過濾弱密碼的例子。這不是特定的時間,也不是太空密集的,所以這個例子只是爲了更清楚地瞭解它的外觀。

問題來了,當我試圖尋找一個解決方案,我發現計算器各種不同的答案,然後還提出了自己的東西。

可能的解決方法1(純AWK):

awk '$0~/xyz/ && $3 < 128 {$1=""; print}' file-with-data.txt

可能的解決方法2(AWK +的餾分):

awk '$0~/xyz/ && $3 < 128' file-with-data.txt | cut -c15-

可能的解決方法3(bash)的:

grep xyz file-with-data.txt | while read -r line 
do if [ $(echo $line | cut -d" " -f3) -le 127 ] 
    then echo $line 
    fi 
done 
+2

只是測量它。 –

+0

好吧,有一個清潔的問題, - 最好呆在bash中,一旦你使用awk,最好呆在awk中 - 沒有什麼值得在那裏測量的。 也可能有使用某種方式或其他有趣的方式的經驗。這裏也不是真正可以衡量的。 – user857990

回答

7

殼是一種環境從中調用工具。它有一定的編程語言結構,可以幫助您按順序調用工具。它不是爲了解析文本文件而創建的,也沒有以任何方式進行優化(例如,語言構造)。

awk是爲解析文本文件而創建的。它的執行範式基於(輸入記錄中的內置循環),並且它有特定的構造來幫助解決這個問題(例如,BEGIN和END部分,變量NR,FNR,NF等)。

任何時候當你在shell中編寫一個循環來解析文本文件時,你都會有錯誤的方法,而且你編寫的shell循環與awk腳本不同,會給出不同的輸入值,運行它的目錄內容來自操作系統你都在等......

IF you just need to find a string or RE in some text 
THEN 
    use grep 
ELIF you just need to select a single-char-separated field 
THEN 
    use cut 
ELIF you just need to do a simple subsitution for an RE on a single line 
THEN 
    use sed 
ELSE 
    use awk 
ENDIF 

WRT這些方法的選擇:

awk '$0~/xyz/ && $3 < 128 {$1=""; print}' file-with-data.txt 
awk '$0~/xyz/ && $3 < 128' file-with-data.txt | cut -c15- 

沒關係。第二個有一些開銷,但你永遠不會注意到它,所以只需選擇一個最符合你的要求的(例如,是否真的想用空白替換第一個字段,還是你真的想削減N個字符?)你對你來說最容易寫和理解。就我個人而言,如果需要剪切,我只需保留在awk中並使用substr()。