Bash & awk:尝试在 awk 中使用 bash 脚本参数时出现分段错误

Posted

技术标签:

【中文标题】Bash & awk:尝试在 awk 中使用 bash 脚本参数时出现分段错误【英文标题】:Bash & awk : Segmentation fault while trying to use bash script arguement in awk 【发布时间】:2021-12-26 07:51:03 【问题描述】:

我正在尝试编写一个脚本来使用 awk 在两个时间戳之间提取日志。

所以这行得通:

awk '$0 >= "07-Nov-2021 13:40:02.124" && $0 <= "07-Nov-2021 13:43:08.124"' websniffer.log

但是当我在 bash 脚本中使用它时,我很难让它发挥作用。这是我的最小示例脚本和错误:

#!/bin/bash

fromtime=$1
totime=$2
nameoffile="websniffer.log"
awk -v fromtimestamp=$fromtime -v totimestamp=$totime -v filenm=$nameoffile '$0 >= "$fromtimestamp" && $0 <= "$totimestamp"' $filenm

现在当我执行这个脚本时:

#terminal@root$ ./samplescript.sh "07-Nov-2021 13:40:02.124" "07-Nov-2021 13:43:08.124"

我明白了:

 ./samplescript.sh "07-Nov-2021 13:40:02.124" "07-Nov-2021 13:43:08.124"./samplescript.sh "07-Nov-2021 13:40:02.124" "07-Nov-2021 13:43:08.124" ./samplescript.sh: line 6:  2190 Segmentation fault      awk -v fromtimestamp=$fromtime -v totimestamp=$totime -v filenm=$nameoffile '$0 >= "$fromtimestamp" && $0 <= "$totimestamp"' $filenm

有人可以帮忙解决这个问题吗?

【问题讨论】:

与 shell 不同,在 awk 程序中,您不能使用 $varname 访问变量的值。只需使用varname 您拥有的日期格式无法按 awk 排序。使用time functions 将该时间戳重新格式化为ISO 8601 类型的时间戳。你也可以在 Linux 上使用 GNU date 来做同样的事情。 你确定这就是你所做的一切吗?该脚本有明显的错误,但我没有看到任何会导致 bash 报告分段违规的内容,您应该从该脚本得到的错误是 awk 的语法错误,因为它试图将 13:40:02.124 解释为脚本.如果您的 shell 在该脚本上存在段错误,那么您的 shell 已损坏,您应该获得一个新的。 如果对你有用,请upvote/accept下面的答案。 【参考方案1】:

有几件事:

#!/bin/bash

fromtime=$1
totime=$2
nameoffile="websniffer.log"
awk -v fromtimestamp="$fromtime" -v totimestamp="$totime" '$0 >= fromtimestamp && $0 <= totimestamp' "$nameoffile"

您需要引用传递给 awk 的 shell 变量(其中包含空格),并且无需创建 filenm 并将其传递给 awk,因为您没有在 awk 脚本中使用它。

【讨论】:

谢谢。我试过你的版本,似乎某处有一个空格......不确定它在哪里抱怨空格(如果这是这里的问题)./samplescript.sh "07-Nov-2021 13:40:02.124" "07 -2021 年 11 月 13:43:08.124" awk:cmd。行:1:意外的令牌 @JefSmackner - 抱歉,做了更多清理工作。当我不测试东西时,就会发生这种情况。请尝试修改后的版本。 @JefSmackner - 修改后的脚本是否符合您的预期?

以上是关于Bash & awk:尝试在 awk 中使用 bash 脚本参数时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章

函数输入和 awk 参数之间的 BASH 名称冲突

使用 BASH 或 awk 或 sed 或其他方式删除文件的前两行

在 bash/sed/awk 中提取文件的最后一个单词

使用 bash 命令 awk sed 等从脚本中提取参数字段

如何在bash中的awk内动态比较变量?

在 awk 循环中访问 bash 数组