我们都知道,总有多种方法可以解决问题.我想知道在一个案例中每个特定解决方案的优点和缺点是什么.时间和空间(也许是清洁 - 但这是主观的,所以不是主要关注点).
你有一个文件,它也包含包含字符串的行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(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
Ed Morton.. 7
shell是一个可以从中调用工具的环境.它具有某些编程语言结构,可帮助您对调用工具的顺序进行排序.它没有被创建,也没有以任何方式(例如语言结构)进行优化,解析文本文件.
创建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
哪些方法可供选择:
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().