gpt4 book ai didi

linux - Unix Bash shell 命令在另一个 grep 匹配时 grep 一些文本

转载 作者:太空宇宙 更新时间:2023-11-04 09:00:55 25 4
gpt4 key购买 nike

我在 unix 目录中有一个 XML 文件。我想搜索某个字符(如果存在),然后 grep 位于该匹配行之前 3 行的文本。

这是我的文件:(abc.xml)

<task Col="5" Object="BCD">
<checkpoint TcpOn="0"/>
<after ActFlg="0"/>
</task>
<task Col="6" Object="ABCD">
<checkpoint TcpOn="0"/>
<after ActFlg="1"/>
</task>
<task Col="7" Object="ABCDE">
<checkpoint TcpOn="0"/>
<after ActFlg="1"/>
</task>

Unix 代码:

grep -i 'actflg="1"' abc.xml

当前答案:这是返回它所在的行。

<after ActFlg="1"/>
<after ActFlg="1"/>

我想要的是:(如果找到 actflg="1",我想做进一步的 grep 以显示输出如下...)

<task Col="6" Object="ABCD">
<task Col="7" Object="ABCDE">

最佳答案

您可以使用 grep -B XX,它会在匹配行之前打印 XX 行。然后你使用 head -1 只打印第一个:

$ grep -B2 -i 'actflg="1"' file
<task Col="6" Object="ABCD">
<checkpoint TcpOn="0"/>
<after ActFlg="1"/>

$ grep -B2 -i 'actflg="1"' file | head -1
<task Col="6" Object="ABCD">

如果有多个匹配,你可以这样做:

$ awk '/ActFlg="1"/ {print preprev} {preprev=prev; prev=$0}' file
<task Col="6" Object="ABCD">
<task Col="7" Object="ABCDE">

说明

  • '/ActFlg="1"/{print preprev} 匹配包含 ActFlg="1" 的行并打印 preprev,一个存储线。
  • {preprev=prev; prev=$0} 这会继续存储前两行。前面的 2 存储在 preprev 中,前面的存储在 prev 中。因此,每当我们换行时,它都会更新。

关于linux - Unix Bash shell 命令在另一个 grep 匹配时 grep 一些文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21629549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com