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 脚本参数时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 BASH 或 awk 或 sed 或其他方式删除文件的前两行