Regex UNIX将文件的最新版本复制到安装日志中
我想从日志文件中获取文件的最新版本,并使用unix命令将其输出到新文件 这是日志文件的一个示例 patches.txtRegex UNIX将文件的最新版本复制到安装日志中,regex,unix,grep,command,Regex,Unix,Grep,Command,我想从日志文件中获取文件的最新版本,并使用unix命令将其输出到新文件 这是日志文件的一个示例 patches.txt Wed Jan 15 10:42:26 MYT 2014, Start, SPIRTE_4.3.2.B1, OK Wed Jan 15 10:42:28 MYT 2014, End, TILES_7.3.66B1, DONE Wed Jan 15 10:42:35 MYT 2014, End, MOVIES_OPENING_4.3.2.B1, FAILED Wed Jan 15
Wed Jan 15 10:42:26 MYT 2014, Start, SPIRTE_4.3.2.B1, OK
Wed Jan 15 10:42:28 MYT 2014, End, TILES_7.3.66B1, DONE
Wed Jan 15 10:42:35 MYT 2014, End, MOVIES_OPENING_4.3.2.B1, FAILED
Wed Jan 15 10:42:36 MYT 2014, Start, MOVEMENT_7.3.68B1, OK
Wed Jan 15 10:42:36 MYT 2014, Start, MOBS_7.3.2B1, OK
Wed Jan 15 10:42:37 MYT 2014, End, TILES_7.3.68B1, DONE
Wed Jan 15 10:42:38 MYT 2014, Start, MOVIES_CUTSCENE_4.3.2.57B1, OK
Wed Jan 15 10:42:38 MYT 2014, Start, GAME_4.3.2.57B1_SERVER, OK
Wed Jan 15 10:42:43 MYT 2014, End, GAME_4.2.57B2_CLIENT, DONE
Wed Jan 15 10:42:43 MYT 2014, End, GAME_4.2.57B4_SERVER, DONE
Wed Jan 15 10:42:45 MYT 2014, End, GAME_4.2.57B1_CLIENT, DONE
Wed Jan 15 10:42:45 MYT 2014, End, GAME_4.2.57B1_SERVER, DONE
Wed Jan 15 10:42:45 MYT 2014, End, DB_4.2.57C2_CLIENT, DONE
Wed Jan 15 10:42:45 MYT 2014, End, DB_4.2.57C2_SERVER, DONE
1.文件的最新日期指定最新版本,例如
Wed Jan 15 10:42:26 MYT 2014, Start, SPIRTE_4.3.2.B1, DONE
Wed Jan 16 10:42:26 MYT 2014, Start, SPIRTE_4.3.2.B1, DONE //latest
Wed Jan 17 10:42:26 MYT 2014, Start, SPIRTE_4.3.2.B1, FAILED //does not consider
2.在行尾完成指定已安装修补程序
3.每个文件都有此格式[字符][版本号][客户机/服务器],[客户机/服务器]不是必需的
4.如果安装了文件的多个版本,则最新版本将覆盖上一版本。e、 g
Wed Jan 15 10:42:37 MYT 2014, End, TILES_7.3.68B1, DONE //overwritten
Wed Jan 16 10:45:37 MYT 2014, End, TILES_7.3.70C1, DONE //latest
<P>5。一个具有后缀的文件的客户端考虑了一个不同的文件,即使它们以相同的名称(但仍然局限于规则4)启动。
以此为例:
Wed Jan 15 10:39:23 MYT 2014, EndPatch, GAME_TILES_7_3_2_3B1_Client, DONE
Wed Jan 15 10:42:45 MYT 2014, EndPatch, MOB_CHARACTER_4.3.2.57B1, DONE
Wed Jan 15 10:41:39 MYT 2014, EndPatch, MOB_CHARACTER_4.3.2.42B4, DONE
Wed Jan 15 10:41:38 MYT 2014, EndPatch, GAME_TILES_7.3.2.33B3, DONE
Wed Jan 15 10:39:34 MYT 2014, EndPatch, GAME_TILES_7.3.2.1B1, DONE
Wed Jan 15 10:39:07 MYT 2014, EndPatch, GAME_TILES_7.3.2.ServicePackB1, DONE
GAME\u TILES\u 7\u 3\u 2\u 3B1\u客户端
是一个文件
GAME\u TILES\u 7.3.2.33B3
是另一个文件
GAME\u TILES\u 7.3.2.1B1
与GAME\u TILES\u 7.3.2.33B3
相同,也与GAME\u TILES\u 7.3.2.ServicePackB1
e、 输出文件的g
Wed Jan 15 10:42:37 MYT 2014, End, TILES_7.3.68B1, DONE
Wed Jan 15 10:42:45 MYT 2014, End, GAME_4.2.57B1_CLIENT, DONE
Wed Jan 15 10:42:45 MYT 2014, End, GAME_4.2.57B1_SERVER, DONE
Wed Jan 15 10:42:45 MYT 2014, End, DB_4.2.57C2_CLIENT, DONE
Wed Jan 15 10:42:45 MYT 2014, End, DB_4.2.57C2_SERVER, DONE
战略:
1. sort all the files
2. grep all the lines that has DONE
3. check for rule #4 and rule #5 (how? I can't use tail for this)
我现在的位置:grep'.*DONE'Wed Jan 15 10:36:16 MYT 2014, StartInstall, MOB_CHARACTER_4.3.2B188, OK
Wed Jan 15 10:36:21 MYT 2014, StartInstall, GAME_TILES_7.3.2B467, OK
Wed Jan 15 10:36:21 MYT 2014, StartInstall, GAME_TILES_7.3.2B467, OK
Wed Jan 15 10:37:33 MYT 2014, EndInstall, GAME_TILES_7.3.2B467, DONE
Wed Jan 15 10:37:35 MYT 2014, StartInstall, MOVIE_CUTSCENE_4.3.2B246, OK
Wed Jan 15 10:37:35 MYT 2014, StartInstall, MOVIE_CUTSCENE_4.3.2B246, OK
Wed Jan 15 10:38:21 MYT 2014, EndInstall, MOVIE_CUTSCENE_4.3.2B246, DONE
Wed Jan 15 10:38:59 MYT 2014, EndInstall, MOB_CHARACTER_4.3.2B188, DONE
Wed Jan 15 10:39:00 MYT 2014, StartPatch, GAME_TILES_7.3.2.ServicePackB1, OK
Wed Jan 15 10:39:00 MYT 2014, StartPatch, GAME_TILES_7.3.2.ServicePackB1, OK
Wed Jan 15 10:39:07 MYT 2014, EndPatch, GAME_TILES_7.3.2.ServicePackB1, DONE
Wed Jan 15 10:39:08 MYT 2014, StartPatch, GAME_TILES_7_3_2_3B1_Server, OK
Wed Jan 15 10:39:08 MYT 2014, StartPatch, GAME_TILES_7_3_2_3B1_Server, OK
Wed Jan 15 10:39:16 MYT 2014, EndPatch, GAME_TILES_7_3_2_3B1_Server, DONE
Wed Jan 15 10:39:16 MYT 2014, StartPatch, GAME_TILES_7_3_2_3B1_Client, OK
Wed Jan 15 10:39:16 MYT 2014, StartPatch, GAME_TILES_7_3_2_3B1_Client, OK
Wed Jan 15 10:39:23 MYT 2014, EndPatch, GAME_TILES_7_3_2_3B1_Client, DONE
Wed Jan 15 10:39:24 MYT 2014, StartPatch, GAME_TILES_7.3.2.1B1, OK
Wed Jan 15 10:39:24 MYT 2014, StartPatch, GAME_TILES_7.3.2.1B1, OK
Wed Jan 15 10:39:34 MYT 2014, EndPatch, GAME_TILES_7.3.2.1B1, DONE
Wed Jan 15 10:39:35 MYT 2014, StartPatch, GAME_TILES_7.3.2.1B1_simulator, OK
Wed Jan 15 10:39:35 MYT 2014, StartPatch, GAME_TILES_7.3.2.1B1_simulator, OK
Wed Jan 15 10:39:45 MYT 2014, EndPatch, GAME_TILES_7.3.2.1B1_simulator, DONE
Wed Jan 15 10:39:46 MYT 2014, StartPatch, MOVIE_CUTSCENE_4.3.2.1B1, OK
Wed Jan 15 10:39:46 MYT 2014, StartPatch, MOVIE_CUTSCENE_4.3.2.1B1, OK
Wed Jan 15 10:39:53 MYT 2014, EndPatch, MOVIE_CUTSCENE_4.3.2.1B1, DONE
Wed Jan 15 10:39:54 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.1B1, OK
Wed Jan 15 10:39:54 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.1B1, OK
Wed Jan 15 10:40:03 MYT 2014, EndPatch, MOB_CHARACTER_4.3.2.1B1, DONE
Wed Jan 15 10:40:04 MYT 2014, StartPatch, GAME_TILES_7.3.2.2B1_Server, OK
Wed Jan 15 10:40:04 MYT 2014, StartPatch, GAME_TILES_7.3.2.2B1_Server, OK
Wed Jan 15 10:40:12 MYT 2014, EndPatch, GAME_TILES_7.3.2.2B1_Server, DONE
Wed Jan 15 10:40:13 MYT 2014, StartPatch, GAME_TILES_7.3.2.2B1_Client, OK
Wed Jan 15 10:40:13 MYT 2014, StartPatch, GAME_TILES_7.3.2.2B1_Client, OK
Wed Jan 15 10:40:21 MYT 2014, EndPatch, GAME_TILES_7.3.2.2B1_Client, DONE
Wed Jan 15 10:40:22 MYT 2014, StartPatch, GAME_TILES_7.3.2.4B2, OK
Wed Jan 15 10:40:22 MYT 2014, StartPatch, GAME_TILES_7.3.2.4B2, OK
Wed Jan 15 10:40:32 MYT 2014, EndPatch, GAME_TILES_7.3.2.4B2, DONE
Wed Jan 15 10:40:33 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.2B1, OK
Wed Jan 15 10:40:33 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.2B1, OK
Wed Jan 15 10:40:42 MYT 2014, EndPatch, MOB_CHARACTER_4.3.2.2B1, DONE
Wed Jan 15 10:40:43 MYT 2014, StartPatch, MOVIE_CUTSCENE_4.3.2.2B3, OK
Wed Jan 15 10:40:43 MYT 2014, StartPatch, MOVIE_CUTSCENE_4.3.2.2B3, OK
Wed Jan 15 10:40:50 MYT 2014, EndPatch, MOVIE_CUTSCENE_4.3.2.2B3, DONE
Wed Jan 15 10:40:51 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.12B2, OK
Wed Jan 15 10:40:51 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.12B2, OK
Wed Jan 15 10:40:51 MYT 2014, EndPatch, MOB_CHARACTER_4.3.2.12B2, DONE
Wed Jan 15 10:40:52 MYT 2014, StartPatch, GAME_TILES_7.3.2.23B2, OK
Wed Jan 15 10:40:52 MYT 2014, StartPatch, GAME_TILES_7.3.2.23B2, OK
Wed Jan 15 10:40:52 MYT 2014, EndPatch, GAME_TILES_7.3.2.23B2, DONE
Wed Jan 15 10:40:53 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.13B1, OK
Wed Jan 15 10:40:53 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.13B1, OK
Wed Jan 15 10:41:07 MYT 2014, EndPatch, MOB_CHARACTER_4.3.2.13B1, DONE
Wed Jan 15 10:41:07 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.17B3, OK
Wed Jan 15 10:41:07 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.17B3, OK
Wed Jan 15 10:41:08 MYT 2014, EndPatch, MOB_CHARACTER_4.3.2.17B3, DONE
Wed Jan 15 10:41:09 MYT 2014, StartPatch, GAME_TILES_7.3.2.30B4, OK
Wed Jan 15 10:41:09 MYT 2014, StartPatch, GAME_TILES_7.3.2.30B4, OK
Wed Jan 15 10:41:09 MYT 2014, EndPatch, GAME_TILES_7.3.2.30B4, DONE
Wed Jan 15 10:41:10 MYT 2014, StartPatch, GAME_TILES_7.3.2.41B1, OK
Wed Jan 15 10:41:10 MYT 2014, StartPatch, GAME_TILES_7.3.2.41B1, OK
Wed Jan 15 10:41:10 MYT 2014, EndPatch, GAME_TILES_7.3.2.41B1, DONE
Wed Jan 15 10:41:11 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.13B2, OK
Wed Jan 15 10:41:11 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.13B2, OK
Wed Jan 15 10:41:26 MYT 2014, EndPatch, MOB_CHARACTER_4.3.2.13B2, DONE
Wed Jan 15 10:41:27 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.16B1, OK
Wed Jan 15 10:41:27 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.16B1, OK
Wed Jan 15 10:41:29 MYT 2014, EndPatch, MOB_CHARACTER_4.3.2.16B1, DONE
Wed Jan 15 10:41:30 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.22B2, OK
Wed Jan 15 10:41:30 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.22B2, OK
Wed Jan 15 10:41:30 MYT 2014, EndPatch, MOB_CHARACTER_4.3.2.22B2, DONE
Wed Jan 15 10:41:31 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.24B2, OK
Wed Jan 15 10:41:31 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.24B2, OK
Wed Jan 15 10:41:31 MYT 2014, EndPatch, MOB_CHARACTER_4.3.2.24B2, DONE
Wed Jan 15 10:41:32 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.25B2, OK
Wed Jan 15 10:41:32 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.25B2, OK
Wed Jan 15 10:41:32 MYT 2014, EndPatch, MOB_CHARACTER_4.3.2.25B2, DONE
Wed Jan 15 10:41:33 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.28B2, OK
Wed Jan 15 10:41:33 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.28B2, OK
Wed Jan 15 10:41:33 MYT 2014, EndPatch, MOB_CHARACTER_4.3.2.28B2, DONE
Wed Jan 15 10:41:34 MYT 2014, StartPatch, GAME_TILES_7.3.2.40B1, OK
Wed Jan 15 10:41:34 MYT 2014, StartPatch, GAME_TILES_7.3.2.40B1, OK
Wed Jan 15 10:41:34 MYT 2014, EndPatch, GAME_TILES_7.3.2.40B1, DONE
Wed Jan 15 10:41:35 MYT 2014, StartPatch, GAME_TILES_7.3.2.43B2, OK
Wed Jan 15 10:41:35 MYT 2014, StartPatch, GAME_TILES_7.3.2.43B2, OK
Wed Jan 15 10:41:36 MYT 2014, EndPatch, GAME_TILES_7.3.2.43B2, DONE
Wed Jan 15 10:41:36 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.32B5, OK
Wed Jan 15 10:41:36 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.32B5, OK
Wed Jan 15 10:41:37 MYT 2014, EndPatch, MOB_CHARACTER_4.3.2.32B5, DONE
Wed Jan 15 10:41:37 MYT 2014, StartPatch, GAME_TILES_7.3.2.33B3, OK
Wed Jan 15 10:41:37 MYT 2014, StartPatch, GAME_TILES_7.3.2.33B3, OK
Wed Jan 15 10:41:38 MYT 2014, EndPatch, GAME_TILES_7.3.2.33B3, DONE
Wed Jan 15 10:41:39 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.42B4, OK
Wed Jan 15 10:41:39 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.42B4, OK
Wed Jan 15 10:41:39 MYT 2014, EndPatch, MOB_CHARACTER_4.3.2.42B4, DONE
Wed Jan 15 10:41:40 MYT 2014, StartPatch, GAME_TILES_7.3.2.62B1_Server, OK
Wed Jan 15 10:41:40 MYT 2014, StartPatch, GAME_TILES_7.3.2.62B1_Server, OK
Wed Jan 15 10:41:51 MYT 2014, EndPatch, GAME_TILES_7.3.2.62B1_Server, DONE
Wed Jan 15 10:41:53 MYT 2014, StartPatch, GAME_TILES_7.3.2.62B1_Client, OK
Wed Jan 15 10:41:53 MYT 2014, StartPatch, GAME_TILES_7.3.2.62B1_Client, OK
Wed Jan 15 10:42:02 MYT 2014, EndPatch, GAME_TILES_7.3.2.62B1_Client, DONE
Wed Jan 15 10:42:03 MYT 2014, StartPatch, MOVIE_CUTSCENE_4.3.2.15B1, OK
Wed Jan 15 10:42:03 MYT 2014, StartPatch, MOVIE_CUTSCENE_4.3.2.15B1, OK
Wed Jan 15 10:42:12 MYT 2014, EndPatch, MOVIE_CUTSCENE_4.3.2.15B1, DONE
Wed Jan 15 10:42:12 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.32B7, OK
Wed Jan 15 10:42:12 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.32B7, OK
Wed Jan 15 10:42:23 MYT 2014, EndPatch, MOB_CHARACTER_4.3.2.32B7, DONE
Wed Jan 15 10:42:24 MYT 2014, StartPatch, GAME_TILES_7.3.2.66B4, OK
Wed Jan 15 10:42:24 MYT 2014, StartPatch, GAME_TILES_7.3.2.66B4, OK
Wed Jan 15 10:42:25 MYT 2014, EndPatch, GAME_TILES_7.3.2.66B4, DONE
Wed Jan 15 10:42:26 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.55B1, OK
Wed Jan 15 10:42:26 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.55B1, OK
Wed Jan 15 10:42:35 MYT 2014, EndPatch, MOB_CHARACTER_4.3.2.55B1, DONE
Wed Jan 15 10:42:36 MYT 2014, StartPatch, GAME_TILES_7.3.2.68B1, OK
Wed Jan 15 10:42:36 MYT 2014, StartPatch, GAME_TILES_7.3.2.68B1, OK
Wed Jan 15 10:42:37 MYT 2014, EndPatch, GAME_TILES_7.3.2.68B1, DONE
Wed Jan 15 10:42:38 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.57B1, OK
Wed Jan 15 10:42:38 MYT 2014, StartPatch, MOB_CHARACTER_4.3.2.57B1, OK
Wed Jan 15 10:42:45 MYT 2014, EndPatch, MOB_CHARACTER_4.3.2.57B1, DONE
好的,这里有一种方法:
awk '$9 == "DONE" { key = $8; add = ""; sub ("_CLIENT,$",",",key); if (key != $8) { add = "_CLIENT," } else { sub ("_SERVER,$",",",key); if (key != $8) { add = "_SERVER," } } sub ("_[^_]*$", "", key); key = key""add; assoc[key] = $0; } END { for (var in assoc) { print assoc[var] } }' inputFile.txt
现在这很难看,所以我将对其进行分解并添加注释,以便您有希望了解其工作原理:
$9 == "DONE" { // Only want "DONE" lines.
key = $8; // Get the key.
add = "" // Save client/server/none and remove
sub ("_CLIENT,$", ",", key);
if (key != $8) {
add = "_CLIENT,"
} else {
sub ("_SERVER,$", ",", key);
if (key != $8) {
add = "_SERVER,"
}
}
sub ("_[^_]*$", "", key); // Remove version.
key = key""add; // Put client/server/none back.
assoc[key] = $0; // Store line.
}
END {
for (var in assoc) { // Print out every keyed line.
print assoc[var]
}
}
老实说,一旦awk
脚本变得如此复杂,您最好将它们放入script.awk
文件中,并使用awk-f
运行该文件-在命令行上执行这些长脚本有点痛苦
这里的技巧是使用键计算和关联数组。从字段8中删除版本意味着它将成为“功能”的有效键,如游戏服务器
或平铺
完成此操作的方式如下所示:
命令将第一个参数(sub
表示\u CLIENT,$
,在行尾)替换为给定变量(\u CLIENT,
)中的第二个参数(仅逗号)键
- 我们首先尝试客户端-如果替换成功,
现在不同于键
,我们保存了这个事实,不必担心检查服务器$8
- 若并没有客户机,我们尝试服务器。如果被发现,我们会将这一事实储存起来并继续下去。如果既没有找到客户机也没有找到服务器,我们将保持原始状态,即没有要添加回密钥的内容
- 现在我们有了一个字符串,末尾只有版本(但我们记得它的末尾是客户端、服务器还是什么都没有)。删除版本的
子
只需删除最后一个
字符(包括)之后的所有内容
- 然后我们添加回客户机或服务器字符串,这是我们的密钥-原始的
,但版本已删除$8
Wed Jan 15 10:42:37 MYT 2014, End, TILES_7.3.68B1, DONE
Wed Jan 15 10:42:45 MYT 2014, End, DB_4.2.57C2_CLIENT, DONE
Wed Jan 15 10:42:45 MYT 2014, End, DB_4.2.57C2_SERVER, DONE
Wed Jan 15 10:42:45 MYT 2014, End, GAME_4.2.57B1_CLIENT, DONE
Wed Jan 15 10:42:45 MYT 2014, End, GAME_4.2.57B1_SERVER, DONE
根据需要。我不确定您是否只能使用bash来实现这一点,或者至少不能有效地实现,您需要的是一个hashmap/字典数据结构,据我所知,bash缺乏该结构,您可以实现一个非常简单的python脚本,使用dictionary+1来实现这一点,但就我而言,代码无法解决规则#5,我将提供一个测试日志文件供您测试。还请注意,文件名可能是MOVIES_OPENING_4.3.2.B1和MOVIES_CUTSCENE_4.3.2.57B1,因此使用第一位,即MOVIES不是解决问题的方法。@McKevin,它解决了规则#5,该规则规定客户端/服务器被视为不同的文件。至于“
”出现在分隔区以外的地方的可能性,我将修改答案。@McKevin:好的,它现在处理有多余的”字符的情况。\u server/\u client
位必须位于末尾(如果存在),并且版本中不允许使用\u
字符。谢谢,您能解释一下这一行吗?sub(_CLIENT,$,,,,,key);如果(钥匙!=8美元){