我在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
也是如此答案 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