grep return匹配行和匹配记录前n行

grep return matching line and n lines before matching record

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

如何使用 bash 来 grep 符号“111AA2026”,获取匹配行上方 3 行的“记录”名称,包括 XML 文件的匹配行本身:

<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”值

示例输出

<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 文件的属性

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

cat temp.xml \
  | grep -B3 '"111AA2026"' \
  | sed -n '/<record/p;/"Symbol/p'
# 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
'

这可能适合您 (GNU sed):

sed -nE '/record/{:a;N;/Symbol/!ba;/111AA2026/s/(\n).*(.*)/--/p}' file

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

仅使用 grep 的替代方案:

grep -B3 '111AA2026' file | grep 'record\|"Symbol"\|--'