我有一堆文件名类似于“Logger.2018-08-04_23:59:59.csv”的文件,我想一次 grep 一堆它们,但仅限于某个日期范围,例如 8/04-8 /17。我怎样才能做到这一点?
我试过:
grep "string" Logger.2018-08-[04-17]*.csv
但这显示的是 8/2 的结果,而不是 8/13-8/17 的结果。我可以分两部分来做
grep "string" Logger.2018-08-0[4-9]*.csv Logger.2018.08-1[0-7]*.csv
这确实有效,但是对于更长的日期范围,是否有更好的方法,这样我就不必每次需要增加第一个数字时都不断添加文件块?
答案1
你有bash
“扩展模式匹配”吗?尝试
shopt -s extglob
ls -la Logger.2018-08-@(0[4-9]|1[0-7])*.csv
答案2
您可以结合使用 find 和正则表达式来将候选文件范围缩小到所需的日期范围,然后将结果通过管道传递给 grep。调整括号中包含的正则表达式部分以更改日期范围。例子:
$find . -type f -regextype posix-extended -regex '.*Logger.2018-08-((0[4-9])|(1[0-7])){1}.*' -exec grep -l text '{}' \; | sort -n -t- -k3
./Logger.2018-08-04_23:59:59.csv
./Logger.2018-08-05_23:59:59.csv
./Logger.2018-08-06_23:59:59.csv
./Logger.2018-08-07_23:59:59.csv
./Logger.2018-08-08_23:59:59.csv
./Logger.2018-08-09_23:59:59.csv
./Logger.2018-08-10_23:59:59.csv
./Logger.2018-08-11_23:59:59.csv
./Logger.2018-08-12_23:59:59.csv
./Logger.2018-08-13_23:59:59.csv
./Logger.2018-08-14_23:59:59.csv
./Logger.2018-08-15_23:59:59.csv
./Logger.2018-08-16_23:59:59.csv
./Logger.2018-08-17_23:59:59.csv
在本例中,我使用 grep 的“-l”选项列出结果文件而不是虚拟文本,以表明它确实将 grep 限制为您想要的文件。要实际查看 grep 文本行,请删除“-l”。我还添加了一个额外的管道来排序以使输出漂亮。
PS我已经找到这个网站了正则表达式101对于使用和学习正则表达式很有价值。