grep 和 tail -f 用于 UTF-16 二进制文件 - 尝试使用简单的 awk

Ale*_*ane 5 awk grep cygwin tail utf-16

我怎样才能实现相当于:

tail -f file.txt | grep 'regexp'
Run Code Online (Sandbox Code Playgroud)

仅输出与正则表达式匹配的缓冲行,例如'Result'文件类型:

$ file file.txt
file.txt:Little-endian UTF-16 Unicode text, with CRLF line terminators
Run Code Online (Sandbox Code Playgroud)

tail -f下面的流内容转换为的示例utf-8

Package end.

Total warnings: 40
Total errors: 0
Elapsed time: 24.4267192 secs.
...Package Executed.

Result: Success
Run Code Online (Sandbox Code Playgroud)

哎呀?

管道 to 中的问题grep使我想到了awk一种一站式解决方案,用于剥离有问题的字符并从正则表达式生成匹配的行。

awk似乎给出了最有希望的结果,但是,我发现它返回整个流而不是单个匹配行:

tail -f file.txt | awk '{sub("/[^\x20-\x7F]/", "");/Result/;print}'
Package end.

Total warnings: 40
Total errors: 0
Elapsed time: 24.4267192 secs.
...Package Executed.

Result: Success
Run Code Online (Sandbox Code Playgroud)

我尝试过的

为什么他们失败了

  • 大多数尝试,只是没有任何内容打印到屏幕上,因为grep搜索'regexp'实际上文本类似于'\x00r\x00e\x00g\x00e\x00x\x00p'- 例如'R'将返回该行'Result: Success''Result'不会
  • 如果完整的正则表达式获得匹配,例如在 using 的情况下grep -f,它将返回整个流,并且似乎不仅仅返回匹配的行
  • 通过sedor tror进行管道传输iconv似乎破坏了管道grep,并且grep似乎仍然只能匹配单个字符

编辑

我查看了原始文件的utf-16格式,xxd目的是使用正则表达式来匹配编码,得到以下输出:

$ tail file.txt | xxd
00000000: 0050 0061 0063 006b 0061 0067 0065 0020  .P.a.c.k.a.g.e.
00000010: 0065 006e 0064 002e 000d 000a 000d 000a  .e.n.d..........
00000020: 0054 006f 0074 0061 006c 0020 0077 0061  .T.o.t.a.l. .w.a
00000030: 0072 006e 0069 006e 0067 0073 003a 0020  .r.n.i.n.g.s.:.
00000040: 0034 0030 000d 000a 0054 006f 0074 0061  .4.0.....T.o.t.a
00000050: 006c 0020 0065 0072 0072 006f 0072 0073  .l. .e.r.r.o.r.s
00000060: 003a 0020 0030 000d 000a 0045 006c 0061  .:. .0.....E.l.a
00000070: 0070 0073 0065 0064 0020 0074 0069 006d  .p.s.e.d. .t.i.m
00000080: 0065 003a 0020 0032 0034 002e 0034 0032  .e.:. .2.4...4.2
00000090: 0036 0037 0031 0039 0032 0020 0073 0065  .6.7.1.9.2. .s.e
000000a0: 0063 0073 002e 000d 000a 002e 002e 002e  .c.s............
000000b0: 0050 0061 0063 006b 0061 0067 0065 0020  .P.a.c.k.a.g.e.
000000c0: 0045 0078 0065 0063 0075 0074 0065 0064  .E.x.e.c.u.t.e.d
000000d0: 002e 000d 000a 000d 000a 0052 0065 0073  ...........R.e.s
000000e0: 0075 006c 0074 003a 0020 0053 0075 0063  .u.l.t.:. .S.u.c
000000f0: 0063 0065 0073 0073 000d 000a 000d 000a  .c.e.s.s........
00000100: 00
Run Code Online (Sandbox Code Playgroud)

Ale*_*ane 0

我意识到一个简单的正则表达式可以忽略搜索字符串中字母之间的任何字符可能有效......

这匹配'Result'同时允许每个字母之间有任何一个字符......

$ tail -f file.txt | grep -a 'R.e.s.u.l.t'
Result: Success

$ tail -f file.txt | awk '/R.e.s.u.l.t./'
Result: Success
Run Code Online (Sandbox Code Playgroud)

或者按照这个答案:避免输入所有繁琐的点......

search="Result"
tail -f file.txt | grep -a -e "$(echo "$search" | sed 's/./&./g')"
Run Code Online (Sandbox Code Playgroud)