【发布时间】:2019-04-29 15:34:16
【问题描述】:
尊敬的同事...
我生成了几千行形式的日志文件:
a
b
X
d
X
e
b
g
Y
a
Y
d
例如,我希望脚本的输出通过“^X”的最后一个匹配项打印所有行,然后仅打印“^Y”的匹配项。以上所需的输出:
a
b
X
d
X
Y
Y
“X”将始终出现,但“Y”可能不会出现。如果没有出现“Y”,我相信最后一个“X”将在文件的最后一行。
用“sed”来做这件事是相当困难的,尽管那是我一直在尝试的。我使用“tac”来翻转行顺序,这样我就可以通过“^X”的 FIRST 匹配删除任何与“^Y”不匹配的内容。因为我不使用“-n”,所以在第一次匹配“^X”之后,所有行都会被回显。我只是再次使用“tac”将其翻转并放入文件中。
这似乎工作......
tac /path/to/logfile | \
sed -e '1,/^X/ { /^Y/!d }' | \
tac > /output/path/logfile.processed
没有...?
PS:“tac”在所有 Linux 上都通用吗?
【问题讨论】:
-
两个
X行之间是否有可能存在Y? -
输入没有X应该输出什么?
-
@kvantour:不。那里不应该有一个“X”,但我相信这个规则是次要的,需要找到最后一个“X”。
-
@EdMorton:输入中总会有一个“X”。谢谢!
标签: shell perl awk sed scripting