cat 标准输出和文件中字节的差异
Difference in cat stdout and bytes in file
我无法弄清楚为什么 cat
在终端中打印的内容与在八进制转储中显示的不同。
l??%ɤ?6?*T?n?8?H-T?g?m?G??[%N??L??T?AX?N?'On?H4?ZR????H?[?vf????GFYS?K?W?x?>x~?
]?ŨWѐ?jW?$?8@Qn???p??#{?96??!??????T006?V??߰G?L$VZ?x?It??{t9s?5E???oE<?|??㘱???Jr4)@z?B?i?פ??l?????W??+&x?U,?-??ax?6f?O???|j^~Ӳ?cs?c>un?%ю?~??i?+?j?2?.??SL2???A?mz?3?%/mk*┙@?Tb?? ? ?]???k??ָ??܅???}???
有点粗糙,但这是我cat file
时的输出。然而,当我cat file | od -tx1
时,结果似乎完全不同。
0000000 1f 8b 08 00 00 00 00 00 02 03 4d 52 4d 6f 1a 31
0000020 10 bd fb 57 8c 72 02 29 58 ca 31 ea 29 34 b4 41
0000040 b4 80 b2 a4 51 49 72 30 bb b3 8b 55 af 6d d9 e6
0000060 f3 d7 d7 63 b3 b0 37 7f cc 7b f3 de 9b e1 ab 17
0000100 58 cf 27 ef f0 c0 78 f1 02 f3 a7 df 13 76 d6 78
0000120 80 cf 11 00 38 2c 4d 6b 1d 7a 0f 7c 0d b5 54 e8
0000140 21 18 e0 cd 39 5f 12 a6 f8 3b 5f 2c 8b 69 c1 f8
0000160 18 08 ca 3e 60 54 87 fd e3 72 f6 05 1f a0 45 8b
0000200 11 cb 39 07 f8 4a f5 cf 93 e2 fb eb 74 b9 9a 2e
0000220 e6 8c 4f 01 d6 84 b9 75 8a 2d 72 a3 da 99 96 da
0000240 0e ba 9f 21 d4 c6 b5 22 74 12 06 cd 59 da ee 91
0000260 b3 69 0d 27 b3 83 83 d0 a9 a2 a7 5d 24 46 10 ca
0000300 a1 a8 4e 20 35 10 f2 02 bc 8f 95 24 12 c2 16 53
0000320 1d 8b e0 f8 55 46 00 b5 c7 63 40 ed a5 d1 54 a0
0000340 41 58 ab 4e c9 27 4f 6e 16 c9 48 34 bf 5a 52 00
0000360 9f a3 9a fd 48 e0 5b 7f c2 76 66 ba f4 b2 11 dc
0000400 47 46 59 53 a3 4b a4 57 91 78 94 3e 78 7e e3 0d
0000420 6c 85 f1 25 c9 a4 01 e5 90 36 18 a9 10 2a 54 18
0000440 a4 6e c0 38 d9 48 2d 54 1f b9 67 7f d0 6d 8c 47
0000460 0e cf d2 5b 25 4e 99 84 4c 0b 5d 81 c5 a8 57 07
0000500 d1 90 e8 6a 57 86 24 d8 38 40 51 6e b3 aa eb 70
0000520 aa 1e ef 23 7b f3 39 36 af cc 21 8a 83 be e3 16
0000540 c3 d6 54 30 30 36 c8 56 a8 fe df b0 47 b2 4c 24
0000560 56 5a 9a 78 ec 49 74 a5 d1 7b 74 39 73 93 35 45
0000600 8b d2 ff 03 6f 45 3c ee 7c d4 da e3 98 b1 19 a2
0000620 cd e3 4a 72 0f 34 29 19 40 7a f0 b1 b7 42 e2 15
0000640 69 82 d7 a4 bf 81 6c ad 92 b4 c4 e3 57 18 05 c8
0000660 f3 bc 2b 26 13 78 fa 55 2c ee 18 2d c9 e0 61 78
0000700 0f e7 36 66 9c 4f 95 ac eb 7c 6a 1c 5e 7e d3 b2
0000720 a4 63 73 c6 63 3e 75 6e e3 25 d1 8e df 7e 16 b4
0000740 ed 69 d9 2b 13 cd 6a 13 a0 15 32 e6 2e b3 b0 18
0000760 53 4c 32 88 d6 c2 41 86 6d 7a 1b 2d 81 f2 33 b4
0001000 25 04 2f 6d 6b 2a e2 94 99 40 ec 85 54 62 a3 d2
0001020 20 a9 20 98 5d b9 a5 82 6b 0f bf b3 d6 b8 90 e9
0001040 dc 85 8e b3 ff 7d ab 06 f5 f9 03 00 00
我的问题是第一个cat
,出现了一个l (0x6C)
字符。为什么这没有出现在我做的 od
中?
另一种情况是在八进制转储的第一行,有一个模式 4d 52 4d 6f
,在 ASCII 中转换为 MRMo
,但是它也没有出现在标准输出中。
我是不是误解了 cat
的工作原理?
十六进制转储中有一个 6c,所以这解释了它的来源。但是转储中的 6c 不在开头,即使它是当你 运行 cat 自己的时候。
我以前见过这个,这通常是发生这种情况的原因:6c 并不是真正的开始。终端正在覆盖字符:例如回车 return 将重新开始该行,或者退格键将返回一个字符。或反向换行,返回一行。实际上,在这种情况下,紧接在 6c 之后的字符是 0d,这是 ASCII 中的回车符-return。
文件有回车return字符。我将 od
的输出保存在 /tmp/1
和 运行 中以查看 \r
个字符:
$ cat /tmp/1 | cut -d' ' -f2- | xxd -r -p | sed 's/\r/<<CR>>\n/g'
MRMo�1��W�r)X�1�)4�A����QIr0���U�m�����c��7�{�ޛ�X�'���x���v�x��8,Mkz|<<CR>>
�T�!��9_��;_,�i��>`T���r��E��9�J�ϓ���t��.�Oք�u�-r�ڙ����!�Ƶ"t�Y�i<<CR>>
'���Щ��]$Fʡ�N 5����$�S���UF��c@���T�AX�N�'On�H4�ZR����H�[�vf����GFYS�K�W�x�>x~�<<CR>>
l��%ɤ�6�*T�n�8�H-T�g�m�G��[%N��L
]�ŨWѐ�jW�$�8@Qn���p��#{�96��!������T006�V��߰G�L$VZ�x�It��{t9s�5E���oE<�|��㘱���Jr4)@z�B�i�פ��l�����W��+&x�U,�-��ax�6f�O���|j^~Ӳ�cs�c>un�%ю�~��i�+�j�2�.��SL2���A�mz�3�%/mk*┙@�Tb�� � �]���k��ָ��܅���}���\
发生的事情是 MRMo�1��W...
部分被打印,然后 \r
将光标移动到行的开头,下一部分 �T�!��9_��;_,�i�
覆盖 输出的开头。
通过减慢打印速度实时观察它:
$ cat file | while dd if=/dev/stdin of=/dev/stdout count=1 bs=1 status=none; do sleep 0.01; done
您将“看到”光标如何移动。
此外,可能有 escape sequences 可以修改字符的颜色并在终端周围移动光标 window。
我无法弄清楚为什么 cat
在终端中打印的内容与在八进制转储中显示的不同。
l??%ɤ?6?*T?n?8?H-T?g?m?G??[%N??L??T?AX?N?'On?H4?ZR????H?[?vf????GFYS?K?W?x?>x~?
]?ŨWѐ?jW?$?8@Qn???p??#{?96??!??????T006?V??߰G?L$VZ?x?It??{t9s?5E???oE<?|??㘱???Jr4)@z?B?i?פ??l?????W??+&x?U,?-??ax?6f?O???|j^~Ӳ?cs?c>un?%ю?~??i?+?j?2?.??SL2???A?mz?3?%/mk*┙@?Tb?? ? ?]???k??ָ??܅???}???
有点粗糙,但这是我cat file
时的输出。然而,当我cat file | od -tx1
时,结果似乎完全不同。
0000000 1f 8b 08 00 00 00 00 00 02 03 4d 52 4d 6f 1a 31
0000020 10 bd fb 57 8c 72 02 29 58 ca 31 ea 29 34 b4 41
0000040 b4 80 b2 a4 51 49 72 30 bb b3 8b 55 af 6d d9 e6
0000060 f3 d7 d7 63 b3 b0 37 7f cc 7b f3 de 9b e1 ab 17
0000100 58 cf 27 ef f0 c0 78 f1 02 f3 a7 df 13 76 d6 78
0000120 80 cf 11 00 38 2c 4d 6b 1d 7a 0f 7c 0d b5 54 e8
0000140 21 18 e0 cd 39 5f 12 a6 f8 3b 5f 2c 8b 69 c1 f8
0000160 18 08 ca 3e 60 54 87 fd e3 72 f6 05 1f a0 45 8b
0000200 11 cb 39 07 f8 4a f5 cf 93 e2 fb eb 74 b9 9a 2e
0000220 e6 8c 4f 01 d6 84 b9 75 8a 2d 72 a3 da 99 96 da
0000240 0e ba 9f 21 d4 c6 b5 22 74 12 06 cd 59 da ee 91
0000260 b3 69 0d 27 b3 83 83 d0 a9 a2 a7 5d 24 46 10 ca
0000300 a1 a8 4e 20 35 10 f2 02 bc 8f 95 24 12 c2 16 53
0000320 1d 8b e0 f8 55 46 00 b5 c7 63 40 ed a5 d1 54 a0
0000340 41 58 ab 4e c9 27 4f 6e 16 c9 48 34 bf 5a 52 00
0000360 9f a3 9a fd 48 e0 5b 7f c2 76 66 ba f4 b2 11 dc
0000400 47 46 59 53 a3 4b a4 57 91 78 94 3e 78 7e e3 0d
0000420 6c 85 f1 25 c9 a4 01 e5 90 36 18 a9 10 2a 54 18
0000440 a4 6e c0 38 d9 48 2d 54 1f b9 67 7f d0 6d 8c 47
0000460 0e cf d2 5b 25 4e 99 84 4c 0b 5d 81 c5 a8 57 07
0000500 d1 90 e8 6a 57 86 24 d8 38 40 51 6e b3 aa eb 70
0000520 aa 1e ef 23 7b f3 39 36 af cc 21 8a 83 be e3 16
0000540 c3 d6 54 30 30 36 c8 56 a8 fe df b0 47 b2 4c 24
0000560 56 5a 9a 78 ec 49 74 a5 d1 7b 74 39 73 93 35 45
0000600 8b d2 ff 03 6f 45 3c ee 7c d4 da e3 98 b1 19 a2
0000620 cd e3 4a 72 0f 34 29 19 40 7a f0 b1 b7 42 e2 15
0000640 69 82 d7 a4 bf 81 6c ad 92 b4 c4 e3 57 18 05 c8
0000660 f3 bc 2b 26 13 78 fa 55 2c ee 18 2d c9 e0 61 78
0000700 0f e7 36 66 9c 4f 95 ac eb 7c 6a 1c 5e 7e d3 b2
0000720 a4 63 73 c6 63 3e 75 6e e3 25 d1 8e df 7e 16 b4
0000740 ed 69 d9 2b 13 cd 6a 13 a0 15 32 e6 2e b3 b0 18
0000760 53 4c 32 88 d6 c2 41 86 6d 7a 1b 2d 81 f2 33 b4
0001000 25 04 2f 6d 6b 2a e2 94 99 40 ec 85 54 62 a3 d2
0001020 20 a9 20 98 5d b9 a5 82 6b 0f bf b3 d6 b8 90 e9
0001040 dc 85 8e b3 ff 7d ab 06 f5 f9 03 00 00
我的问题是第一个cat
,出现了一个l (0x6C)
字符。为什么这没有出现在我做的 od
中?
另一种情况是在八进制转储的第一行,有一个模式 4d 52 4d 6f
,在 ASCII 中转换为 MRMo
,但是它也没有出现在标准输出中。
我是不是误解了 cat
的工作原理?
十六进制转储中有一个 6c,所以这解释了它的来源。但是转储中的 6c 不在开头,即使它是当你 运行 cat 自己的时候。
我以前见过这个,这通常是发生这种情况的原因:6c 并不是真正的开始。终端正在覆盖字符:例如回车 return 将重新开始该行,或者退格键将返回一个字符。或反向换行,返回一行。实际上,在这种情况下,紧接在 6c 之后的字符是 0d,这是 ASCII 中的回车符-return。
文件有回车return字符。我将 od
的输出保存在 /tmp/1
和 运行 中以查看 \r
个字符:
$ cat /tmp/1 | cut -d' ' -f2- | xxd -r -p | sed 's/\r/<<CR>>\n/g'
MRMo�1��W�r)X�1�)4�A����QIr0���U�m�����c��7�{�ޛ�X�'���x���v�x��8,Mkz|<<CR>>
�T�!��9_��;_,�i��>`T���r��E��9�J�ϓ���t��.�Oք�u�-r�ڙ����!�Ƶ"t�Y�i<<CR>>
'���Щ��]$Fʡ�N 5����$�S���UF��c@���T�AX�N�'On�H4�ZR����H�[�vf����GFYS�K�W�x�>x~�<<CR>>
l��%ɤ�6�*T�n�8�H-T�g�m�G��[%N��L
]�ŨWѐ�jW�$�8@Qn���p��#{�96��!������T006�V��߰G�L$VZ�x�It��{t9s�5E���oE<�|��㘱���Jr4)@z�B�i�פ��l�����W��+&x�U,�-��ax�6f�O���|j^~Ӳ�cs�c>un�%ю�~��i�+�j�2�.��SL2���A�mz�3�%/mk*┙@�Tb�� � �]���k��ָ��܅���}���\
发生的事情是 MRMo�1��W...
部分被打印,然后 \r
将光标移动到行的开头,下一部分 �T�!��9_��;_,�i�
覆盖 输出的开头。
通过减慢打印速度实时观察它:
$ cat file | while dd if=/dev/stdin of=/dev/stdout count=1 bs=1 status=none; do sleep 0.01; done
您将“看到”光标如何移动。
此外,可能有 escape sequences 可以修改字符的颜色并在终端周围移动光标 window。