防止tail修改终端的字符集

防止tail修改终端的字符集

在 Linux 终端 (CentOS) 中,我使用该命令tail --follow=name my-rolling-file.log来查看应用程序的日志。

有时在日志中,会转储一些二进制数据(我转储通常包含字符串的 Camel 消息的正文,但有时包含二进制和/或特殊字符,例如 UTF-8 中的中文),当发生这种情况时,我的终端会像|现在改为管道字符ö

我只是猜测是二进制数据记录会导致问题,我想知道是否可以要求命令tail忽略特殊字符。我检查了手册页,但没有找到任何内容。

目前,为了解决这个问题,我必须在终端中Ctrl-C进行拖尾并重新启动命令。如果可能的话,我想阻止这些操作。resettail

如果您知道除 之外的另一个命令tail,但具有相同的功能(跟随滚动文件),那么只要它可以在 CentOS 6.5 下安装和运行,那么它也是可以接受的。

答案1

tail您可以通过将命令传递到以下命令将特殊字符(二进制数据)转换为可以安全显示的普通字符cat -v

tail --follow=name my-rolling-file.log | cat -v

(也称为)-v的(详细)选项使用和符号显示“非打印”字符:cat--show-nonprinting^M-

  • 0x00 显示为^@
  • 0x01 显示为^A
  • 0x02 显示为^B
  • ETC。
  • 0x7F 显示为^?
  • 0x80-0xFF 显示如下,M-后面是字节的低七位的表示。

或者,如果您想放弃这些字符,请使用:

tail --follow=name my-rolling-file.log | tr -cd "\t\n -~"

tr“翻译”字符;即映射它们。例如,它可用于将小写字母更改为大写字母。该-d选项告诉它删除字符;例如,tr -d aeiou删除所有(小写)元音。选项-c表示补足;即,执行除我指定的字符之外的所有字符。  "\t\n -~"是制表符、换行符和所有普通的可打印字符。

答案2

那这个呢,

tail --follow=name my-rolling-file.log | strings

默认情况下strings,它只会输出长度为 4(或更多)的可打印字符,但您可以使用 更改此设置-n {number}

答案3

将(一些麻烦的)字符转换为.with tr

tail -f data | tr "\000-\011\013-\037\177-\377" "."

答案4

让我们来less解决这个问题,因为它很擅长。

分页器less非常擅长格式化二进制文件以进行输出。此外,寻呼机功能(例如回滚和搜索)通常很有用。
它没有直接的选项来跟踪增长的文件,但它可以在启动后提供击键来“键入”。

密钥F随着文件的增长而开始,当文件增长时更新屏幕。
在密钥前面加上+not of前缀-,并像选项一样使用它:

更换tail -f

less +F growing-file.log

要继续按名称跟踪文件,即使文件已移走或删除,并使用相同名称重新创建,请添加选项--follow-name;它修改键的内容F+F执行的操作,它本身不会开始执行以下操作:

替换tail -F( --follow=name):

less --follow-name +F rolling-file.log

如果文件被识别为“二进制文件”,less则会询问您是否真的要查看它 - 为了避免该问题,也可以使用选项-f--force):

less --follow-name +F -f rolling-binary-file.log

-f(请注意, for的含义less与相同选项的 不同tail。)

使用Ctrl+c停止关注,这样您就可以向后滚动或搜索。

  • 再次开始关注F.
  • 跳转开始:g.
  • 跳转开始:G.
  • 搜索:/
  • 辞职:q

二进制输出示例

$ less +F /usr/bin/vim 
"/usr/bin/vim" may be a binary file.  See it anyway?

按 y (您可以使用 来避免-f)后,屏幕显示:

 ^A^@^@^@^@^@<E5>
 ^A^@^@^@^@^@<E6>
 ^A^@^@^@^@^@^@^P^A^@^@^@^@^@^B^P^A^@^@^@^@^@8^P^A^@^@^@^@^@F^P^A^@^@^@^@^@
 <F1>^A^@^@^@^@^@^P<F1>^A^@^@^@^@^@-<F1>^A^@^@^@^@^@0<F1>^A^@^@^@^@^@i<F1>^A
 ^L(^@^@^@^@^@^@^@^@^@^@^@^@^@<A3><A5>&^@^@^@^@^@^@^@^@^@^@^@^@^@b['^@^@^@^@
 @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@@<A7>&^@^@^@^@
 <AB>&^@^@^@^@^@Ȣ&^@^@^@^@^@^L,^@^@^@^@^@^@<FF><FF><FF><FF><FF><FF><FF><FF>
  ^@^@^@^@^@^@s]&^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^_<D3>%^@^@^@^@^@̢
 <AF>&^@^@^@^@^@<CA><(^@^@^@^@^@^B^D^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
 <B1>&^@^@^@^@^@^D^D^H^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^R<B1>&^@^@
 ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@<A9><B3>&^@^@^@^@^@D<B8>&^@^@
 <B5>&^@^@^@^@^@^]T&^@^@^@^@^@^BL^@^@^@^@^@^@H<8A>O^@^@^@^@^@F@^@^@^@^@^@^@
 K'^@^@^@^@^@^C<C4><FF><FF>^@^@^@^@^OK'^@^@^@^@^@^C<C3><FF><FF>^@^@^@^@^TK'
 #^@^@^@^@^@^D^@^@^@^@^@^@^@<E7>v&^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
 #^@^@^@^@^@^D^@^@^@^@^@^@^@<E7>v&^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
 #^@^@^@^@^@p|#^@^@^@^@^@P~#^@^@^@^@^@^@^@^@^@^@^@^@^@^P
 #^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@<90>{#^@^@^@^@^@^@^@^@^@^@^@^@^@
Waiting for data... (interrupt to abort)

控制字符以插入符表示法显示,例如^A^@是空字节)。
它们也在终端中突出显示(上面未显示),以使字符 Control-A与后面跟着的^A字符不同。^A

如何显示二进制字符的配置

man less:

Control  and  binary  characters  are  displayed  in  standout (reverse
video).  Each such character is displayed in caret notation if possible
(e.g.  ^A for control-A).  Caret notation is used only if inverting the
0100 bit results in a normal printable character.  Otherwise, the char‐
acter  is displayed as a hex number in angle brackets.  This format can
be changed by setting the LESSBINFMT environment variable.   LESSBINFMT
may begin with a "*" and one character to select the display attribute:
"*k" is blinking, "*d" is bold, "*u" is underlined, "*s"  is  standout,
and  "*n"  is  normal.  If LESSBINFMT does not begin with a "*", normal
attribute is assumed.  The remainder of LESSBINFMT is  a  string  which
may  include one printf-style escape sequence (a % followed by x, X, o,
d, etc.).  For example, if LESSBINFMT is  "*u[%x]",  binary  characters
are  displayed  in  underlined hexadecimal surrounded by brackets.  The
default if no LESSBINFMT is  specified  is  "*s<%02X>".   Warning:  the
result  of  expanding the character via LESSBINFMT must be less than 31
characters.

When the character set is utf-8, the LESSUTFBINFMT environment variable
acts similarly to LESSBINFMT but it applies to Unicode code points that
were successfully decoded but are unsuitable for display  (e.g.,  unas‐
signed  code  points).   Its  default  value is "<U+%04lX>".  Note that
LESSUTFBINFMT and LESSBINFMT  share  their  display  attribute  setting
("*x")  so specifying one will affect both; LESSUTFBINFMT is read after
LESSBINFMT so its setting, if any,  will  have  priority.   Problematic
octets  in  a  UTF-8  file (octets of a truncated sequence, octets of a
complete but non-shortest form  sequence,  illegal  octets,  and  stray
trailing  octets)  are displayed individually using LESSBINFMT so as to
facilitate diagnostic of how the UTF-8 file is ill-formed.

相关内容