gpt4 book ai didi

linux - Awk 与 Awk + ​​cut 与 bash

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:45:31 25 4
gpt4 key购买 nike

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

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

最佳答案

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

wrt 从这些方法中选择哪一个:

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

关于linux - Awk 与 Awk + ​​cut 与 bash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20452192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com