Dom*_*que 15 linux grep textfiles binary-files windows-subsystem-for-linux
我正在使用 Windows-10 计算机,使用 WSL。
NLog
我正在调查由C# 应用程序生成的日志文件。我期望日志条目出现在整个文件的各处,但我看到以下内容:
Linux prompt> grep "geen mengcontainer" logfile.log
2023-03-07 07:25:08.7971 | Warn | ... | geen mengcontainer.
2023-03-07 07:25:09.8285 | Warn | ... | geen mengcontainer.
2023-03-07 07:25:10.8754 | Warn | ... | geen mengcontainer.
Binary file logfile.log matches
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,在 07:25:10 之后,grep
即使文件在当天剩余的时间里继续前进,也会停止。似乎有一些字符告诉grep
该文件不是文本文件,而是二进制文件,导致grep
停止工作。
有关该文件的更多信息:
Linux prompt>file logfile.log
logfile.log: ASCII text, with CRLF line terminators
Run Code Online (Sandbox Code Playgroud)
有关我的 Linux WSL 安装的更多信息:
Linux prompt>uname -a
Linux ComputerName 4.4.0-19041-Microsoft
#2311-Microsoft Tue Nov 08 17:09:00 PST 2022
x86_64 x86_64 x86_64 GNU/Linux
Linux prompt> cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.2 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.2 LTS"
VERSION_ID="20.04"
...
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
Run Code Online (Sandbox Code Playgroud)
有关我的安装的更多信息grep
:
Linux prompt> grep --version
grep (GNU grep) 3.4
Run Code Online (Sandbox Code Playgroud)
我能做些什么?
grep
停止过滤的字符?grep
以避免停止过滤?grep
不具有这样行为的版本?(请考虑到这些apt update
东西在我的环境中不起作用)提前致谢
use*_*686 33
用于grep -a
强制文件始终被视为文本。
“二进制文件”检测是代码页敏感的 \xe2\x80\x93 如果 grep 在 Linux 上像往常一样期望 UTF-8 输入,它实际上最终会检测到“ANSI”(Windows-125x,ISO 8859-x)编码的文本文件作为二进制文件。在“C”语言环境下使用LC_CTYPE=C grep
或运行 grepLC_ALL=C grep
也可以避免此问题。
(此外,“file”所说的输入为“ASCII”完全基于对文件中初始字节的快速查看;它实际上并不扫描整个内容,而“grep”当然会扫描整个内容。)
\n通常整个文件采用相同的编码(即所有文件都可能是非 UTF-8),因此查找有问题的字符的一个简单方法是搜索非 ASCII 字节(LC_ALL=C
可能需要):
grep -a -P -n --color '[^\\x00-\\x7F]' logfile.log\n
Run Code Online (Sandbox Code Playgroud)\nperl -ne 'print "Line $.:\\t$_" if /[^\\0-\\177]/' < logfile.log\n
Run Code Online (Sandbox Code Playgroud)\n这也会突出显示有问题的字节:
\nperl -ne 'print "Line $.:\\t$_" if s/[^\\0-\\177]/sprintf"\\e[41m<%02X>\\e[m",ord$&/ge' < logfile.log\n
Run Code Online (Sandbox Code Playgroud)\n如果文件是有效的 UTF-8(除了一些奇数行之外),请使用类似的方法来打印 UTF-8 解码失败的行:
\nperl -MEncode -ne 'print "Line $.:\\t$_" if !eval{decode("UTF-8", $_, Encode::FB_CROAK)}' < logfile.log\n
Run Code Online (Sandbox Code Playgroud)\n
归档时间: |
|
查看次数: |
3381 次 |
最近记录: |