1、背景
使用grep查找文件时蹦出这个错误,
[root@localhost ~]# lspci -vvv | grep -A50 "Ethernet controller" | grep -E "Capabilities|Ethernet controller"
Binary file (standard input) matches
这我表示一脸懵逼了,我明明grep的都是文本,怎么就出现Binary file了。
2、解决方案
经广大网友提示,可以通过grep的-a参数解决,
[root@localhost ~]# lspci -vvv | grep -A50 "Ethernet controller" | grep -aE "Capabilities|Ethernet controller"
02:00.0 Ethernet controller: Mellanox Technologies MT26448 [ConnectX EN 10GigE, PCIe 2.0 5GT/s] (rev b0)
Capabilities: [40] Power Management version 3
Capabilities: [48] Vital Product Data
0c:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection
Capabilities: [c8] Power Management version 2
Capabilities: [d0] MSI: Enable- Count=1/1 Maskable- 64bit+
Capabilities: [e0] Express (v1) Endpoint, MSI 00
Capabilities: [a0] MSI-X: Enable+ Count=5 Masked-
Capabilities: [100 v1] Advanced Error Reporting
Capabilities: [140 v1] Device Serial Number 04-7d-7b-ff-ff-61-62-d4
good,我们看下man手册里-a的解释,
-a, --text
Process a binary file as if it were text; this is equivalent to
the --binary-files=text option.
也就是将二进制文件当做文本处理。
3、原因
那为什么明明我们操作的都是文本,却会出现二进制文件呢。
我们分解一下我们的命令,
[root@localhost ~]# lspci -vvv | grep -A50 "Ethernet controller" > a
[root@localhost ~]# file a
a: data
这下就清楚了,因为我们第一次grep的文本正好满足data文件类型的定义,导致系统认为这是一个data型文件,而不是regular文件类型,从而出现报错。
我们通过查看文件也可以发现一些端倪,
[^@^@] Unknown:
[^@^@] Unknown:
[^@^@] Unknown:
[^@^@] Unknown:
grep后的结果中有一些特殊字符,这些特殊字符就会被当做二进制文件处理。
删除这些特殊字符就OK了,
[root@localhost ~]# file a
a: ASCII text
ok,done!~