首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Awk对Awk + cut vs bash

Awk对Awk + cut vs bash
EN

Stack Overflow用户
提问于 2013-12-08 10:12:23
回答 1查看 1.8K关注 0票数 0

我们都知道解决问题的方法总是多种多样的。我在想,在一个案例中,每一种解决方案的优点和缺点是什么。时间和空间

您得到了一个文件,该文件还包含包含字符串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):

代码语言:javascript
复制
grep xyz file-with-data.txt | while read -r line
do if [ $(echo $line | cut -d" " -f3)  -le 127 ]
   then echo $line
   fi
done
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-08 14:36:08

shell是用来调用工具的环境。它具有特定的编程语言结构,可以帮助您按调用工具的顺序排列顺序。它不是为解析文本文件而创建的,也不是以任何方式(例如语言构造)来优化的。

创建Awk是为了解析文本文件。它的执行范例基于这一点(输入记录的内置循环),并且它有特定的结构来帮助它(例如开始和结束部分、变量NR、FNR、NF等)。

每当您用shell编写循环来解析文本文件时,您都有错误的方法,而您编写的shell循环(与awk脚本不同)将神秘地失败,给出各种输入值、您从其中运行的目录的内容、您正在运行的操作系统等等……

代码语言:javascript
复制
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从这些方法中选择哪一种:

代码语言:javascript
复制
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()。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20452192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档