【发布时间】:2014-09-08 02:03:50
【问题描述】:
Linux Debian 测试 64。
我希望 grep 或 awk 以下内容...
ExifListAll = (下)
DSCF3566.JPG 2014-07-21 12:54:32 On 1
DSCF3566.RAF 2014-07-21 12:54:32 On 1
DSCF3567.JPG 2014-07-21 12:54:33 On 2
DSCF3567.RAF 2014-07-21 12:54:33 On 2
DSCF3568.JPG 2014-07-21 12:54:33 On 3
DSCF3568.RAF 2014-07-21 12:54:33 On 3
DSCF3569.JPG 2014-07-21 12:54:34 Off 0
我将使用第 3 列时间 12:54:33 开始,搜索前 1 秒和后 1 秒, 第 4 列 = “开启”,第 5 列 = 1、2 或 3
到目前为止我已经尝试过了;
echo "$ExifListAll" | grep -E '2014-07-21.*12:45:3[3-4].*On.*[1-3]'
我可以更有效地使用 awk 1 班轮吗?
我这样做对吗?
echo "$ExifListAll" | awk '$4 == "On" && $5~/1/,$5~/3/'
谢谢。
【问题讨论】:
-
你能提供你想要的输出吗?
-
不要在 awk 中使用范围表达式。它们使琐碎的任务变得非常简单,而稍微有趣的任务需要完全重写。使用
/start/{f=1} f; /end/{f=0}而不是/start/,/end/。 -
@qwwqwwq。如果上述任何一项用于启动所需的输出,将使用 1 秒前、1 秒后(第 3 列)搜索上述列表,然后确保第 4 列为“开”。如果使用 DSCF3567.JPG,然后它将找到上面的所有项目(第 1-6 行)。
-
@Ed Morton。你会如何改变以采纳你的建议?例如回声“$ExifListAll”| awk '$4 == "开" && $5~/1/,$5~/3/'
-
这取决于您认为该声明的含义,但我猜可能是
awk '$5~/1/{f=1} f && ($4=="On"); $5~/3/{f=0}'。