簡體   English   中英

Awk vs Awk + ​​cut vs.bash

[英]Awk vs Awk + cut vs. bash

我們都知道解決問題總是有多種方法。 我想知道每種特定解決方案在一個案例中的利弊是什么。 在時間和空間上(也許很干凈),但這是主觀的,因此不是主要重點。

您得到了一個文件,該文件還包含包含字符串xyz ,但不是排他的。 您對在特定列中整數值應滿足條件的行感興趣。

我使用此示例的示例是從sslscan輸出中過濾弱密碼。 這不是特別的時間,也不是占用空間,因此此示例只是為了更清楚地了解其外觀。

當我試圖尋找解決方案時,出現了問題,我在stackoverflow上找到了各種不同的答案,然后我自己也提出了一些建議。

可能的解決方案1(純awk):

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

可能的解決方案2(awk + ​​cut):

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

可能的解決方案3(重擊):

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

外殼是從中調用工具的環境。 它具有某些編程語言構造,可幫助您對調用工具的順序進行排序。 它不是為解析文本文件而創建的,也沒有以任何方式(例如語言構造)進行優化。

創建Awk是為了解析文本文件。 它的執行范例基於該范例(輸入記錄的內置循環),並且具有特定的構造(例如,BEGIN和END節,變量NR,FNR,NF等)來提供幫助。

每當您在shell中編寫一個循環來解析文本文件時,您都會使用錯誤的方法,並且與awk腳本不同,您編寫的shell循環在給定各種輸入值,從中運行它的目錄的內容,操作系統下會神秘地失敗。你在等...

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

從以下哪種方法中選擇:

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()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM