【问题标题】:Bash String Used to Select Range [duplicate]用于选择范围的 Bash 字符串 [重复]
【发布时间】:2018-05-23 09:43:09
【问题描述】:

以下数据位于 .csv 文件中,该文件会随着新数据的下载而更改。 数据的语法始终为 YYYY-MM-DDTHHMMSS,示例如下:

2017-12-08T194949
2017-12-08T194952
2017-12-08T195000
2017-12-08T195007
2017-12-08T195007
2017-12-08T195014
2017-12-08T195016
2017-12-08T195016
2017-12-08T195016
2017-12-08T195016
2017-12-08T195021
2017-12-08T195026
2017-12-08T195029
2017-12-08T195030
2017-12-08T195030
2017-12-08T195034
2017-12-08T195051
2017-12-08T195101
2017-12-08T195105
2017-12-08T195135
2017-12-08T195138
2017-12-08T195140
2017-12-08T195144
2017-12-08T195148
2017-12-08T195154
2017-12-08T195204
2017-12-08T195205
2017-12-08T195219
2017-12-08T195223
2017-12-08T195224
2017-12-08T195225

目前,我使用以下方法定义我的日期字符串:

lower_bound=`date -d '1 day ago' "+%Y-%m-%dT%H%M%S"`
upper_bound=`date -d '12 hours ago' "+%Y-%m-%dT%H%M%S"`

我回顾文件的分钟数取决于系统时间。我可以将我的回溯量设置为任意值。

我认为我已经接近 sed/awk 如下:

sed -n "/$lower_bound/,/$upper_bound/p" data.csv
awk -v a="$lower_bound" -v b="$upper_bound" '/a/{flag=1;next}/b/{flag=0}flag' data.csv

鉴于这些回溯字符串,上面的命令应该打印出两个变量 $lower_bound 和 $upper_bound 之间的日期范围。显然,我在上述变量中​​尝试了不同的回溯时间。

关于为什么不打印日期范围的任何想法?任何帮助将不胜感激;提前谢谢你。

【问题讨论】:

  • $date 出错 - 我提供了更多示例数据并更改了日期定义语法(见上文)
  • 不是最佳的,但应该比你拥有的更好:awk -v a="$lower_bound" -v b="$upper_bound" '$1>=a && $1<=b'.
  • @gniourf_gniourf - 谢谢,这行得通。为日后参考,为什么要和$1做比较?
  • 我认为你需要了解一点awktag info page中链接了一些资源。
  • /a/ 匹配 a 作为正则表达式而不是 a 作为变量。

标签: bash perl sorting awk sed


【解决方案1】:

这:/a/ 将匹配文字 "a"。这:$0 ~ a 将匹配您存储在变量a 中的字符串,因此您的命令应该是:

awk -v a="$lower_bound" -v b="$upper_bound"
    '$0 ~ a {flag=1;next} $0 ~ b {flag=0} flag' data.csv

但是这些 awk/sed 命令不会为您提供您想要的,因为它们只会意外地匹配行,以防您的日志中存在确切的日期时间界限。更可能的是,确切的下限将不存在,因此永远不会设置标志。

如果您想打印该日期范围,那么您应该按字母顺序 比较这些日期,这意味着 $0 > a$0 < b

awk -v a="$lower_bound" -v b="$upper_bound" '$0 > a && $0 < b' data.csv

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-11
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    相关资源
    最近更新 更多