Awk vs Awk + ​​cut vs. bash

 个阖家团圆 发布于 2023-02-12 11:16

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

你有一个文件,它也包含包含字符串的行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

Ed Morton.. 7

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

哪些方法可供选择:

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

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有