将 PuTTY Raw SSH 输出转换为纯文本
Convert PuTTY Raw SSH output to plain text
我有一个来自 PuTTY 会话的 240MB 日志文件。这是错误地以 "SSH packets and raw data" 格式而非 "All session output" 格式记录的。如果我在文本编辑器中打开文件,那么我可以看到我需要的数据(纯文本)。
问题是从原始数据中提取它。
例如:
Incoming raw data at 2016-01-06 15:47:42
00000000 e8 fd c2 d2 88 a9 39 b9 2a 77 2a 7b 4a 60 fc 21 ......9.*w*{J`.!
00000010 1d f5 fc d4 b1 58 1f 4d 68 a4 ef 83 03 39 59 b7 .....X.Mh....9Y.
00000020 41 be 36 7b b5 3c 10 fa 65 27 77 30 77 97 02 39 A.6{.<..e'w0w..9
00000030 46 4c 28 da 5c c6 2c 1e ae 33 db e1 a8 09 ea 4a FL(.\.,..3.....J
00000040 06 94 c6 eb 38 8e d3 d3 33 13 78 08 7c 5f 41 56 ....8...3.x.|_AV
00000050 f1 13 9e e1 ....
Incoming packet #0x31, type 94 / 0x5e (SSH2_MSG_CHANNEL_DATA)
00000000 00 00 01 00 00 00 00 20 64 69 73 61 62 6c 69 6e ....... disablin
00000010 67 20 61 20 72 75 6e 6e 69 6e 67 20 77 61 74 63 g a running watc
00000020 68 64 6f 67 2e 2e 0d 0a hdog....
Incoming raw data at 2016-01-06 15:47:42
00000000 dc 96 f3 54 f8 a8 5c 83 80 7b a8 07 da 79 95 50 ...T..\..{...y.P
00000010 3f 19 2f 0c f0 03 a1 01 a3 33 2f 97 75 9d 47 15 ?./......3/.u.G.
00000020 b9 95 df c6 66 e0 50 32 88 1e db 5b 73 1b 7b ad ....f.P2...[s.{.
我认为我需要做的是只读取文件中标记为 "Incoming packet" 的部分。然后我可以读取 ascii 字符代码并转换为可读文本(这将恢复制表符、换行符和回车符 returns)。
我不熟悉awk 或sed,但我知道一点grep。我如何才能首先提取我需要从 ASCII 代码转换为文本的部分(可变大小)?
sed -n '/^Incoming packet/,/^Incoming raw data/{//!p}
这将打印匹配 Incoming packet
和 Incoming raw
之间的行。进一步处理此输出以获得所需的输出。
仅打印匹配行中的 ASCII 字符(打印最后 17 个字符):
sed -n '/Incoming packet/,/Incoming raw data/{//!{s/^.*\(.\{17\}\)//;p}}'
参考:1, 2
我有一个来自 PuTTY 会话的 240MB 日志文件。这是错误地以 "SSH packets and raw data" 格式而非 "All session output" 格式记录的。如果我在文本编辑器中打开文件,那么我可以看到我需要的数据(纯文本)。
问题是从原始数据中提取它。
例如:
Incoming raw data at 2016-01-06 15:47:42
00000000 e8 fd c2 d2 88 a9 39 b9 2a 77 2a 7b 4a 60 fc 21 ......9.*w*{J`.!
00000010 1d f5 fc d4 b1 58 1f 4d 68 a4 ef 83 03 39 59 b7 .....X.Mh....9Y.
00000020 41 be 36 7b b5 3c 10 fa 65 27 77 30 77 97 02 39 A.6{.<..e'w0w..9
00000030 46 4c 28 da 5c c6 2c 1e ae 33 db e1 a8 09 ea 4a FL(.\.,..3.....J
00000040 06 94 c6 eb 38 8e d3 d3 33 13 78 08 7c 5f 41 56 ....8...3.x.|_AV
00000050 f1 13 9e e1 ....
Incoming packet #0x31, type 94 / 0x5e (SSH2_MSG_CHANNEL_DATA)
00000000 00 00 01 00 00 00 00 20 64 69 73 61 62 6c 69 6e ....... disablin
00000010 67 20 61 20 72 75 6e 6e 69 6e 67 20 77 61 74 63 g a running watc
00000020 68 64 6f 67 2e 2e 0d 0a hdog....
Incoming raw data at 2016-01-06 15:47:42
00000000 dc 96 f3 54 f8 a8 5c 83 80 7b a8 07 da 79 95 50 ...T..\..{...y.P
00000010 3f 19 2f 0c f0 03 a1 01 a3 33 2f 97 75 9d 47 15 ?./......3/.u.G.
00000020 b9 95 df c6 66 e0 50 32 88 1e db 5b 73 1b 7b ad ....f.P2...[s.{.
我认为我需要做的是只读取文件中标记为 "Incoming packet" 的部分。然后我可以读取 ascii 字符代码并转换为可读文本(这将恢复制表符、换行符和回车符 returns)。
我不熟悉awk 或sed,但我知道一点grep。我如何才能首先提取我需要从 ASCII 代码转换为文本的部分(可变大小)?
sed -n '/^Incoming packet/,/^Incoming raw data/{//!p}
这将打印匹配 Incoming packet
和 Incoming raw
之间的行。进一步处理此输出以获得所需的输出。
仅打印匹配行中的 ASCII 字符(打印最后 17 个字符):
sed -n '/Incoming packet/,/Incoming raw data/{//!{s/^.*\(.\{17\}\)//;p}}'
参考:1, 2