【问题标题】:Awk vs Awk + cut vs. bashawk 与 awk + ​​cut 与 bash
【发布时间】:2013-12-08 10:12:23
【问题描述】:

我们都知道解决问题总是有多种方法。我想知道在一种情况下每种特定解决方案的优缺点是什么。时间和空间方面(也许是清洁度——但这是主观的,所以不是主要焦点)。

您有一个文件,其中还包含包含字符串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

【问题讨论】:

  • 嗯,存在清洁问题,- 留在 bash 中是否更好,在 awk 中后留在 awk 中是否更好... - 没有什么可以衡量的。也可能有使用一种或另一种有趣的方式的经验。这里也不是真正可测量的。

标签: linux bash awk grep cut


【解决方案1】:

外壳是调用工具的环境。它具有某些编程语言结构,可帮助您对调用工具的顺序进行排序。它不是为解析文本文件而创建的,也没有以任何方式(例如语言结构)进行优化。

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

【讨论】:

    猜你喜欢
    • 2015-01-21
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多