sed和tac:写错误:参数无效

时间:2018-02-17 08:58:31

标签: windows sed gnu tac

我在Windows上使用GNU Coreutils。我想从日志文件

获取最后一个错误行

SED正则表达式工作正常(但在文件中找到第一个条目)

c:\path\sed -n "/70\-Error/{p;q}" MyFile.log

TAC命令

c:\path\tac MyFile.log

成功反转整个文件,没有错误

但是当我将两者合并时,我从文件输出中得到最后一个匹配行,如预期的那样,但也是一个错误:

c:\path\tac MyFile.log | c:\path\sed -n "/70\-Error/{p;q}"

给出

14/02/2018 10:19:03 [9] 70-Error: Errorcode: Query returned error 524 (Query timeout)
c:\path\tac: write error: Invalid argument

编辑:

sed -n "p" MyFile.log

给出输出

sed -n "p" MyFile.log | cat

也提供输出,没有错误

sed -n "p" MyFile.log | sed -n "/70\-Error/{p;q}"

给出第一个匹配的行和错误:

30/01/2018 10:30:28 [7] 70-Error: Action failed ....
sed: couldn't write 225 items to stdout: Broken pipe

使用CAT而不是TAC:

cat MyFile.log | sed -n "/70\-Error/{p;q}"

给出第一个匹配的行然后错误 - 看起来与TAC场景相同:

30/01/2018 10:30:28 [7] 70-Error: Action failed ...
cat: write error: Invalid argument

其他测试:

sed -n "/fe80::a828:2146:58d1:28df/{p}" MyFile.log

很好,但

sed -n "/fe80::a828:2146:58d1:28df/{p}" MyFile.log | tac

不提供输出,只提供此错误:

sed: couldn't flush stdout: Invalid argument

我认为问题可能与MyFile.log有一个完整路径(包括空格)这样的事实相关联,因此我将MyFile.log复制到与GNU工具相同的文件夹中,所以一切都在当前文件夹中没有复杂的文件名......但同样的事情。

sed -n "p" MyFile.log | tac

从文件中给出(第一个)25行,反之,然后:

sed: couldn't write 225 items to stdout: Broken pipe

可能是某种内存/缓存大小限制?

sed --unbuffered

没有改变任何事情。

MyFile.log是4MB和27,000行

EDIT2:

tac MyFile.log | sed "/70\-Error/h;$!d;x"

工作正常,即使对于包含空格的引用的MyFile.log

也是如此

1 个答案:

答案 0 :(得分:1)

这可能适合你(GNU sed):

counterp<T2type, m>

这会将错误消息复制到保留空间,并在文件末尾打印它。

N.B。使用sed '/70\\-Error/h;$!d;x' file 来表示\\,因为单个反斜杠是sed中的引用元字符。

要打印上一条错误消息后的所有行,请使用:

\

要在最后一条错误消息后打印选定数量的行,例如3,请使用:

sed '/70-Error/h;//!H;$!d;x' file

或者,眼睛更容易:

sed '/70-Error/h;//!H;$!d;x;s/\(\(\n[^\n]*\)\{3\}\).*/\1/' file