bash - 如何根据行开头的日期过滤 bash 命令的输出行?

标签 bash shell awk

我收到以下几行作为某些 bash 管道的输出

output
20200604_tsv
20200605_tsv
20200606_tsv
20200706_tsv

我的变量中有一个 YYYYMMDD 格式的日期变量

filter_date="20200605"

我想在输出行上应用日期操作,即仅选择行的第一部分(“_”之前)小于等于filter_date的行。

即预期输出

20200604_tsv
20200605_tsv

如何在 bash 管道中实现这种过滤?

我尝试过以下操作(按字典顺序匹配字符串),但无法过滤并获取原始名称。

BASH_CMD_THAT_OUTPUT_LINES | sort | awk '{name = ($1); print name <= "20200605*"}'

## Answer
1
0
0
0

最佳答案

Awk 能够通过去除多余的内容来非常轻松地将字符串转换为数字。例如。如果向字符串 123_foo 添加 0,则该字符串将转换为 123。因此以下操作将执行您的请求:

command | awk '($0+0 < 20200605)'

如果您有像 YYYYMMDD 这样的可排序日期格式,则此方法非常有效。如果您有不同的格式,例如 YYYYDDMM,则必须首先转换格式来使用不同的技术。例如。

command | awk '{d=substr($0,1,4)substr($0,7,2)substr($0,5,2)}(d+0 < 20200605)'

请注意,在最后一个解决方案中,您必须反转最后一个数字中的月份和日期:即 20200605 是 YYYYMMDD 而不是 YYYYDDMM

关于bash - 如何根据行开头的日期过滤 bash 命令的输出行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62755484/

相关文章:

Linux/Bash 重命名文件夹正则表达式

shell - 在执行 shell 中获取 Jenkins 环境变量

awk - 根据匹配条件注释每隔一列

regex - php脚本中的Bash命令,根据特定列的值获取文件的某些行

bash - gnu 并行 : space interpretation and within process variable editing

linux - ps h -fwC 有什么作用?

python - 无法将以下文本文件解析为 pandas 数据框?

linux - Bash - 替换逗号之间的随机文本

bash - 如何在特定列中获取包含模式的行并将它们移动到行而不是 UNIX 中常见的列很少

MySQL shell 将结果显示为类似 "less"的内容