Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Awk vs Awk+;切割vs.猛击_Linux_Bash_Awk_Grep_Cut - Fatal编程技术网

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-