Linux Awk vs Awk+;切割vs.猛击
我们都知道,解决问题的方法总是多种多样的。我想知道在一个案例中,每种解决方案的优点和缺点是什么。时间和空间方面(可能还有清洁度,但这是主观的,所以不是主要焦点) 您得到了一个文件,其中还包含包含字符串Linux Awk vs Awk+;切割vs.猛击,linux,bash,awk,grep,cut,Linux,Bash,Awk,Grep,Cut,我们都知道,解决问题的方法总是多种多样的。我想知道在一个案例中,每种解决方案的优点和缺点是什么。时间和空间方面(可能还有清洁度,但这是主观的,所以不是主要焦点) 您得到了一个文件,其中还包含包含字符串xyz,但不是独占的行。您感兴趣的是,在特定列中,整数值应满足某个条件的行 我使用它的一个例子是从sslscan输出中过滤弱密码。这既不是特定的时间密集型,也不是空间密集型,所以这个例子只是为了更清楚地了解这可能是什么样子 当我试图寻找解决方案时,问题出现了,我在stackoverflow上找到了各
xyz
,但不是独占的行。您感兴趣的是,在特定列中,整数值应满足某个条件的行
我使用它的一个例子是从sslscan输出中过滤弱密码。这既不是特定的时间密集型,也不是空间密集型,所以这个例子只是为了更清楚地了解这可能是什么样子
当我试图寻找解决方案时,问题出现了,我在stackoverflow上找到了各种不同的答案,然后我自己也想出了一些办法
可能的解决方案1(纯awk):
awk'$0~/xyz/&&&$3<128{$1=”“;print}文件,其中包含data.txt
可能的解决方案2(awk+切割):
awk'$0~/xyz/&&&$3<128'file-with-data.txt | cut-c15-
可能的解决方案3(bash):
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
ENDIF
请注意以下哪种方法可供选择:
awk '$0~/xyz/ && $3 < 128 {$1=""; print}' file-with-data.txt
awk '$0~/xyz/ && $3 < 128' file-with-data.txt | cut -c15-
awk'$0~/xyz/&&&$3<128{$1=”“;print}文件-with-data.txt
awk'$0~/xyz/&&$3<128'文件-with-data.txt | cut-c15-
没关系。第二个字段有一点开销,但您永远不会注意到,因此只需选择最适合您需求的字段(例如,您真的想用空格替换第一个字段,还是真的想剪切N个字符?)即可,并且最容易编写和理解。就我个人而言,如果需要切割,我会留在awk并使用substr()。好吧,这是清洁的问题,-留在bash更好吗,在awk后留在awk更好吗…-那里没有什么真正需要衡量的。此外,可能会有使用某种方式的经验,这是很有趣的。在这里也不可测量。
awk '$0~/xyz/ && $3 < 128 {$1=""; print}' file-with-data.txt
awk '$0~/xyz/ && $3 < 128' file-with-data.txt | cut -c15-