首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >grep在匹配记录之前返回匹配行和n行

grep在匹配记录之前返回匹配行和n行
EN

Stack Overflow用户
提问于 2021-07-19 17:03:11
回答 3查看 83关注 0票数 1

我有一个受限制的bash (在其他工具中有grep和sed,但没有awk),我试图使用它来快速自动化一些日常工作。我目前正在使用"grep keyword filename -b3“,我想知道如何在我有限的工具中更有效地做到这一点。

对于一个XML文件,如何使用bash to grep表示符号"111AA2026",获取匹配行上面3行的“记录”名称,包括匹配行本身:

代码语言:javascript
复制
<record name="111111H2" />
<items>
  <field name="Electronic Identifier" value="1"/>
  <field name="Symbol" value="111AA2026"/>
  <field name="Full Symbol" value="111AA202622MARFUT"/>
  <field name="System Identifier" value="1"/>
  <field name="System Identifier Description" value="Description"/>
</items>
<record name="111111N1" />
<items>
  <field name="Electronic Identifier" value="2"/>
  <field name="Symbol" value="111AA2026"/>
  <field name="Full Symbol" value="111AA202621JULFUT"/>
  <field name="System Identifier" value="2"/>
  <field name="System Identifier Description" value="Description"/>
</items>
<record name="111111Q1" />
<items>
  <field name="Electronic Identifier" value="3"/>
  <field name="Symbol" value="111AA2026"/>
  <field name="Full Symbol" value="111AA202621AUGFUT"/>
  <field name="System Identifier" value="3"/>
  <field name="System Identifier Description" value="Description"/>
</items>
<record name="111111U1" />
<items>
  <field name="Electronic Identifier" value="4"/>
  <field name="Symbol" value="111AA2026"/>
  <field name="Full Symbol" value="111AA202621SEPFUT"/>
  <field name="System Identifier" value="4"/>
  <field name="System Identifier Description" value="Description"/>
</items>
<record name="111111Z1" />
<items>
  <field name="Electronic Identifier" value="5"/>
  <field name="Symbol" value="111AA2026"/>
  <field name="Full Symbol" value="111AA202621DECFUT"/>
  <field name="System Identifier" value="5"/>
  <field name="System Identifier Description" value="Description"/>
</items>

请注意,在实际文件中有多个不同的"Symbol“值

样本输出

代码语言:javascript
复制
<record name="111111H2" />
 <field name="Symbol" value="111AA2026"/>
--
<record name="111111N1" />
 <field name="Symbol" value="111AA2026"/>
--
<record name="111111Q1" />
 <field name="Symbol" value="111AA2026"/>
--
<record name="111111U1" />
 <field name="Symbol" value="111AA2026"/>
--
<record name="111111Z1" />
 <field name="Symbol" value="111AA2026"/>

我遇到的关键挑战是获得一个匹配结果,它给出了匹配的行和上面的3行,而不是关于如何获取XML文件的属性

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-07-19 17:15:45

不确定这是否是您要查找的内容,但它输出的内容与您在示例输出中给出的内容非常相似。

代码语言:javascript
复制
cat temp.xml \
  | grep -B3 '"111AA2026"' \
  | sed -n '/<record/p;/"Symbol/p'
代码语言:javascript
复制
# The -n flag disables printing of all lines, which is what sed
# does by default, so we need to handle printing ourselves using
# the "p" command.
sed -n '
  # [p]rint all lines that contain: <record
  /<record/ p
  # [p]rint all lines that contain: "Symbol
  /"Symbol/ p
'
票数 2
EN

Stack Overflow用户

发布于 2021-07-19 18:21:39

这可能适用于您(GNU sed):

代码语言:javascript
复制
sed -nE '/record/{:a;N;/Symbol/!ba;/111AA2026/s/(\n).*(\1.*)/\2\1--/p}' file

收集recordSymbol之间的行,如果这些行包含文字111AA2026,则打印集合的第一行和最后一行以及分隔符--

仅使用grep的替代方法:

代码语言:javascript
复制
grep -B3 '111AA2026' file | grep 'record\|"Symbol"\|--'
票数 1
EN

Stack Overflow用户

发布于 2021-07-19 17:21:02

代码语言:javascript
复制
grep  'record\|"Symbol"' $file
代码语言:javascript
复制
grep  'record\|"Symbol"' $file
<record name="111111H2" />
  <field name="Symbol" value="111AA2026"/>
<record name="111111N1" />
  <field name="Symbol" value="111AA2026"/>
<record name="111111Q1" />
  <field name="Symbol" value="111AA2026"/>
<record name="111111U1" />
  <field name="Symbol" value="111AA2026"/>
<record name="111111Z1" />
  <field name="Symbol" value="111AA2026"/>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68437818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档