我们都知道解决问题的方法总是多种多样的。我在想,在一个案例中,每一种解决方案的优点和缺点是什么。时间和空间
您得到了一个文件,该文件还包含包含字符串xyz的行,但不是只包含字符串。您感兴趣的是在特定列中整数值应该满足条件的行。
我使用它的一个例子是从sslscan输出中过滤弱密码。这既不是特别的时间,也不是空间密集型的,所以这个例子只是为了更清楚地了解它的样子。
当我试图寻找一个解决方案的时候,这个问题出现了,我在堆栈溢出上找到了各种不同的答案,然后我自己也想出了一些东西。
可能的解决方案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发布于 2013-12-08 14:36:08
shell是用来调用工具的环境。它具有特定的编程语言结构,可以帮助您按调用工具的顺序排列顺序。它不是为解析文本文件而创建的,也不是以任何方式(例如语言构造)来优化的。
创建Awk是为了解析文本文件。它的执行范例基于这一点(输入记录的内置循环),并且它有特定的结构来帮助它(例如开始和结束部分、变量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
ENDIFwrt从这些方法中选择哪一种:
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()。
https://stackoverflow.com/questions/20452192
复制相似问题