测试文件
cat text.txt
09:00:00 TESTING
09:00:01 TESTING
09:00:02 TESTING
09:00:03 TESTING
09:00:04 TESTING
09:01:00 TESTING
09:01:01 TESTING
09:01:02 TESTING
09:01:03 TESTING
09:02:00 TESTING
09:02:01 TESTING
09:02:02 TESTING
09:02:03 TESTING
09:03:00 TESTING
09:03:01 TESTING
09:03:02 TESTING
09:03:03 TESTING
没有变量的实际模式搜索工作正常:
cat ./text.txt|awk -v start="09:01" -v end="09:02" '/09:01/,/09:02/' text.txt
09:01:00 TESTING
09:01:01 TESTING
09:01:02 TESTING
09:01:03 TESTING
09:02:00 TESTING
使用失败的变量进行模式搜索
awk -v start="09:01" -v end="09:02" '/start/,/end/' text.txt
令人讨厌的黑客使用shell echo来包装变量,使其工作
echo "awk -v start="09:01" -v end="09:02" '/$start/,/$end/' text.txt"
awk -v start=09:01 -v end=09:02 '/09:01/,/09:02/' text.txt
start="09:01"; end="09:02"; echo "awk -v start="09:01" -v end="09:02 text.txt" '/$start/,/$end/'"|/bin/sh
09:01:00 TESTING
09:01:01 TESTING
09:01:02 TESTING
09:01:03 TESTING
09:02:00 TESTING
关于我做错了什么或者这是awk中可能的功能的任何想法?
这些建议有效,我在结果上有所不同:
1
awk -v start="09:01" -v end="09:02" '$0~start,$0~end' text.txt
09:01:00 TESTING
09:01:01 TESTING
09:01:02 TESTING
09:01:03 TESTING
09:02:00 TESTING
2
awk -v start="09:01" -v end="09:02" 'match($0,start),match($0,end)' text.txt
09:01:00 TESTING
09:01:01 TESTING
09:01:02 TESTING
09:01:03 TESTING
09:02:00 TESTING
3
awk -v start="09:01" -v end="09:02" '$0~start{print}$0~end{print}' text.txt
09:01:00 TESTING
09:01:01 TESTING
09:01:02 TESTING
09:01:03 TESTING
09:02:00 TESTING
09:02:01 TESTING
09:02:02 TESTING
09:02:03 TESTING
4
awk -v start="09:01" -v end="09:02" '$1~start||$1~end' text.txt
09:01:00 TESTING
09:01:01 TESTING
09:01:02 TESTING
09:01:03 TESTING
09:02:00 TESTING
09:02:01 TESTING
09:02:02 TESTING
09:02:03 TESTING
3和4返回完整的结果,前两个一旦到达模式
就停止答案 0 :(得分:5)
您需要将变量锚定到行的开头:
awk -v start="09:01" -v end="09:02" '$0~"^"start,$0~"^"end' text.txt
所以09:02匹配09:02:01而不是17:09:02。
我个人不会使用这个范围的东西,而是在适当的时候设置/清除/测试一个标志,因为它更具有可扩展性。例如尝试其中的每一个,看看操纵打印是否容易,或者不是分界线:
awk -v start="09:01" -v end="09:02" '$0~"^"start{f=1} f; $0~"^"end{f=0}' text.txt
awk -v start="09:01" -v end="09:02" 'f; $0~"^"start{f=1} $0~"^"end{f=0}' text.txt
awk -v start="09:01" -v end="09:02" '$0~"^"start{f=1} $0~"^"end{f=0} f;' text.txt
awk -v start="09:01" -v end="09:02" '$0~"^"end{f=0} f; $0~"^"start{f=1}' text.txt
我看到你接受@sudo_Os回答你可能希望得到所有的09:02次,而不是停在第一次。如果这是真的,只需使用字符串而不是RE比较:
$ awk -v start="09:01" -v end="09:02" '$1>=start":00" && $1<=end":59"' file
09:01:00 TESTING
09:01:01 TESTING
09:01:02 TESTING
09:01:03 TESTING
09:02:00 TESTING
09:02:01 TESTING
09:02:02 TESTING
09:02:03 TESTING
或者这会得到相同的结果:
$ awk -F: -v start="09:01" -v end="09:02" '$1FS$2>=start && $1FS$2<=end' file
答案 1 :(得分:3)
不应该匹配:
$ awk -F: -v hour=9 -v start=1 -v end=2 '$1==hour && $2>=start && $2<=end' file
09:01:00 TESTING
09:01:01 TESTING
09:01:02 TESTING
09:01:03 TESTING
09:02:00 TESTING
09:02:01 TESTING
09:02:02 TESTING
09:02:03 TESTING
你不想要所有的09:02:XX
行吗?
答案 2 :(得分:2)
要将开始和结束用作模式,您可以使用~
运算符明确告诉awk:
awk -v start="09:01" -v end="09:02" '$0 ~ start,$0 ~ end'
或match()
:
awk -v start="09:01" -v end="09:02" 'match($0,start),match($0,end)'
答案 3 :(得分:1)
awk -v start="09:01" -v end="09:02" 'substr($0,1,5) >= start && substr($0,1,5) <= end' test.txt
当时间范围跨越时间范围时,这将起作用,并且仅查看小时和分钟。不使用$ 1,以避免对具有前导空格但其他匹配的内容进行“点击”。
说实话,我会使用BEGIN和一些参数来设置开始/结束。因为可以在线上获得很多东西,但对我来说并不意味着你必须这样做。
以下是我使用的数据:
09:00:00 TESTING
09:00:01 TESTING
09:00:02 TESTING
09:00:03 TESTING
09:00:04 TESTING
09:01:00 TESTING
09:01:01 TESTING
09:01:02 TESTING
09:01:03 TESTING
09:02:00 TESTING
09:02:01 TESTING
09:02:02 TESTING
09:02:03 TESTING
09:03:00 TESTING
09:03:01 TESTING
09:03:02 TESTING
09:03:03 TESTING
02:09:01 toasted
19:01:01 toasted
09:01:01 toasted
20:00:00 toasted 09:01:01