web-dev-qa-db-ja.com

端末の文字セットをテールが変更しないようにする

Linuxターミナル(CentOS)では、アプリケーションのログを表示するためにtail --follow=name my-rolling-file.logコマンドを使用しています。

ときどきログにいくつかのバイナリデータがダンプされ(私は通常文字列を含むキャメルメッセージの本文をダンプしますが、時々バイナリやUTF-8の中国語のような特殊文字をダンプします)、それが発生するとターミナルは次のように破損します代わりにパイプ文字|öになりました。

問題を引き起こす可能性があるのはバイナリデータロギングであると推測しましたが、tailコマンドに特殊文字を無視するように要求できるかどうか疑問に思っています。私はマニュアルページをチェックしましたが、そこには何も見つかりませんでした。

現在、問題を修正するには、テーリングをCtrl-Cし、ターミナルでresetを作成し、tailコマンドを再起動する必要があります。できればこれらの操作を防ぎたいです。

tail以外のコマンドを知っていて、同じ機能(ローリングファイルに続く)を備えている場合、CentOS 6.5でインストールおよび実行できる限り、それは許容されます。

5
рüффп

これはどうですか、

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

stringsのデフォルトでは、4(またはそれ以上)の長さの印刷可能な文字のみが出力されますが、これは-n {number}で変更できます。

5
roaima

tailコマンドをcat -vにパイプすることにより、特殊文字(バイナリデータ)を安全に表示できる通常の文字に変換できます。

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

cat-v(詳細)オプション(--show-nonprintingとも呼ばれます)は、^およびM-表記を使用して「非印刷」文字を表示します。

  • 0x00は^@として表示されます
  • 0x01は^Aとして表示されます
  • 0x02は^Bとして表示されます
  • 等.
  • 0x7Fは^?として表示されます
  • 0x80-0xFFはM-として表示され、その後にバイトの下位7ビットが表示されます。

または、文字を破棄する場合は、次を使用します。

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

tr文字を「変換」します。つまり、それらをマップします。たとえば、小文字を大文字に変更するために使用できます。 -dオプションは、文字を削除するように指示します。たとえば、tr -d aeiouはすべての(小文字の)母音を削除します。 -cオプションは補完を意味します。つまり、指定した文字以外のすべての文字を実行します。 "\t\n -~"は、タブ、改行、およびすべての通常の印刷可能な文字です。

12
Scott

(厄介な)文字をtr.に変換します。

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

lessが問題を処理できるようにします。

ポケットベルlessは、出力用のバイナリファイルのフォーマットに優れています。また、スクロールバックや検索などのページャー機能も役立つことがよくあります。
大きくなるファイルを追跡するための直接的なオプションはありませんが、起動後に「入力」するためのキーストロークを提供する方法があります。

キー F 拡大するファイルの追跡を開始し、ファイルが拡大すると画面を更新します。
キーの前に+ではなく-を付け、それをオプションのように使用します。

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

less-fの意味は、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と区別します。 。

2進文字の表示方法の構成

から 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.
2
Volker Siegel