Binary file (standard input) matches问题深究

说明:本文的命令和文件都是在Mac OS下,Linux下大同小异。

一、问题描述和解决

1、使用grep查找一个log文件内容,结果提示Binary file (standard input) matches

cat editserver.log.2021-04-07 | grep "80CACCD0EC7BE79266DC3EACB7E709BE"
Binary file (standard input) matches


2、根据提示大概意思这个一个二进制文件,网上很容易找到相关的解决办法,grep的时候带上-a就行,解释是对于二进制文件需要带上-a

cat editserver.log.2021-04-07 | grep -a "80CACCD0EC7BE79266DC3EACB7E709BE" --color
2021-04-07T18:33:24.351+08:00 INFO editserver-webpdf-default-6bbff7bf9d-4qmkw[1] @util/httpclient/httpclient.go:260 "download complete. url: http://****/v2/openapi/getfilestream?_k=517a0fd588d98235&_t=1617791582&fileId=80CACCD0EC7BE79266DC3EACB7E709BE&userId=70066334&action=view&imid=70066334&imname=heehi&corpId=1&fileName=%E5%A6%82%E6%B5%8112%E6%9C%88%E6%BB%A1%E6%84%8F%E5%BA%A6%E8%B0%83%E7%A0%94%E6%8A%A5%E5%91%8A1210.pdf&source=chat&container=3495958&version=1607571284&fileSource=3&userName=%E8%B4%BA%E9%94%8B&_s=a4a38f539f804af315ff8f405aa8cacea4de04be5343c8ebeb2d59d5c9617a28, digest: -, size: 24654824, cost: 22.139206382s" traceid="35f5f728c10b49f161555342f2428465" operation="GET_/websocket/v2" sessionid="edit/d91719ac5c706e4f7be0f017b7073fe7"
2021-04-07T19:31:12.530+08:00 INFO editserver-webpdf-default-6bbff7bf9d-xsf5c[1] @util/httpclient/httpclient.go:260 "download complete. url: http://****/v2/openapi/getfilestream?_k=517a0fd588d98235&_t=1617795071&fileId=80CACCD0EC7BE79266DC3EACB7E709BE&userId=70066334&action=view&imid=70066334&imname=heehi&corpId=1&fileName=%E5%A6%82%E6%B5%8112%E6%9C%88%E6%BB%A1%E6%84%8F%E5%BA%A6%E8%B0%83%E7%A0%94%E6%8A%A5%E5%91%8A1210.pdf&source=chat&container=3495958&version=1607571284&fileSource=3&userName=%E8%B4%BA%E9%94%8B&_s=3fd965632000d73697ca1c061be900225eb295f827321027c4c79e39bf4a6a9d, digest: -, size: 24654824, cost: 791.821599ms" sessionid="edit/d91719ac5c706e4f7be0f017b7073fe7" traceid="6a44ef9c3b524dee7e13280b90231afe" operation="GET_/websocket/v2"

确实带上-a后问题就解决了,然后我很清楚,这个文件并不是二进制文件,因为我在用grep查找之前,用tail打开过

tail -n 2 editserver.log.2021-04-07
2021-04-07T23:59:59.583+08:00 INFO editserver-webwpp-default-6569799569-cbdxv[1] @util/httpclient/httpclient.go:260 "download complete. url: http://****/v2/openapi/getfilestream?_k=517a0fd588d98235&_t=1617811198&fileId=E33740B70BFEBFE7DA9064AC5863C65A&userId=tanweimin_gz&action=view&container=4394428&corpId=1&fileName=05+%E3%80%8A%E7%99%BE%E5%BA%A6%E8%B4%B4%E5%90%A7%E3%80%8B202004.pptx&fileSource=3&imid=1871511407&imname=MINGTREG&reqid=3567125697&source=chat&userName=%E8%B0%AD%E5%A8%81%E6%B0%91&version=1617765054&_s=b36888ca9d88dcf6d4590c3250653b9d3504e41db413d39d6cbd765b40e99d1b, digest: -, size: 17581191, cost: 505.272247ms" connid="24d56c72254122b81cf02ba7538e73ab" operation="GetQueryInitData" sessionkey="edit/0b935fc9b85b17c3c68a12d919a69d84"
2021-04-07T23:59:59.891+08:00 INFO editserver-webwpp-default-6569799569-cbdxv[1] @weboffice/editserver/basesession/basesession.go:1022 "core open success. is security docment: false, cost: 307.585315ms" operation="GetQueryInitData" sessionkey="edit/0b935fc9b85b17c3c68a12d919a69d84" connid="24d56c72254122b81cf02ba7538e73ab"

3、很明显这就是一个普通的文本文件,那么为什么会被认为是二进制文件呢,问题来了怎么判断一个文件的类型?
二、Unix系统下怎么判断一个文件类型
1、Unix下哪些文件类型
7种文件类型

文件类型 特点(ls -la列出的第一个属性) 说明
普通文件 纯文本文件(ASCII);二进制文件(binary);数据格式的文件(data);各种压缩文件
目录文件 d 存储数据以供系统存取的接口设备,简单而言就是硬盘
块设备文件 b 串行端口的接口设备,例如键盘、鼠标
字符设备文件 c
套接字文件 s
管道文件 p
链接文件 l

2、判断文件类型

方法一:使用ls -la

ls -la editserver.log.2021-04-07
-rwxrw-r-- 1 wangchuanbo 672505530 91440702 4 8 18:38 editserver.log.2021-04-07

方法二:使用file命令

file editserver.log.2021-04-07
editserver.log.2021-04-07: data
file /usr/local/mysql/data/binlog.000001

/usr/local/mysql/data/binlog.000001: MySQL replication log, server id 1 MySQL V5+, server version 8.0.23
file /usr/local/mysql/bin/mysql
/usr/local/mysql/bin/mysql: Mach-O 64-bit executable x86_64

方法三:使用stat命令

stat editserver.log.2021-04-07<br>16777221 13443435 -rwxrw-r-- 1 wangchuanbo (672505530) 0 91440702 "Apr 11 01:00:23 2021" "Apr 8 18:38:16 2021" "Apr 11 01:02:42 2021" "Apr 8 18:38:16 2021" 4096 200704 0 editserver.log.2021-04-07

3、file命令返回结果说明

man file
file -- determine file type

返回结果

结果 含义 备注
empty 空文件
data 数据文件
ASCII text ASCII编码的文本文件
directory 目录文件
executable 可执行的目标代码文件 真正的二进制文件吧

三、问题的根源
通过上面文件类型的分析,我们发现这个文件就是一个普通数据类型文件,那么为什么会被当成二进制文件呢,排除了隐藏数据扩展名的可能,还是百思不得奇解,还是回到问题本身,去查看grep的文档才揭开谜题,最终发现文本中有二进制内容
1、grep -a的本意
通过man grep发现,如果文件中包括二进制字符用grep会提示“Binary file (standard input) matches”,并不是二进制文件,-a只是把二进制字符强制当普通字符。

man grep

-a, --text<br>Treat all files as ASCII text. Normally grep will simply print ``Binary file<br>… matches'' if files contain binary characters. Use of this option forces<br>grep to output lines matching the specified pattern.

注:通过手册,发现–text跟-a是一样的效果

2、问题文件中一定有二进制字符
手册说了,文件中有二进制字符才会提示“Binary file (standard input) matches”,那么就一定存在,带着这个想法,用vim打开文件逐步浏览果然发现了二进制内容

vim editserver.log.2021-04-07
2021-04-07T00:00:28.051+08:00 INFO editserver-webet-default-78c699b567-vn4dw[1] @weboffice/editserver/basesession/basesession.go:928 "user join. user id: a718e1add585a05831df67350a3aeb00, conn id: efeefd88498c652554a69ff46dfa38ac, permission: read" operation="GET_/websocket/v2" traceid="be34a6b2883a45d877e30626bbd48e81" sessionid="edit/0bbc0d1a3610a5261d21c05e86bb97eb"<br>^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@

Tips: 用vim打开几十M的文件其实不会很卡,开始怕卡住了,测试根本不会

du -sh editserver.log.2021-04-07
98M editserver.log.2021-04-07

3、二进制内容究竟是什么
待补充

四、总结
1、使用grep,如果文件中包括二进制字符(binary characters),或不可读的字符(unreadable characters)都有可能提示“Binary file (standard input) matches”。此时,带上-a或–text就可以了
2、使用grep, 如果搜索不到即使包括二进制字符也不会提示

3、Mac OS下需要单独开启root账号,并设置密码,才能su root, 访问个别目录需要root权限,比如MySQL的bin log文件【具体开启方式可自行搜索】

参考:
grep returns “Binary file (standard input) matches” when trying to find a string pattern in file
Linux下七种文件类型、文件属性及其查看方法

发表评论

电子邮件地址不会被公开。 必填项已用*标注