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
收集 record
和 Symbol
之间的行,如果这些行包含文字 111AA2026
,打印集合的第一行和最后一行加上分隔符 --
.
仅使用 grep 的替代方案:
grep -B3 '111AA2026' file | grep 'record\|"Symbol"\|--'
我有一个受限的 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
收集 record
和 Symbol
之间的行,如果这些行包含文字 111AA2026
,打印集合的第一行和最后一行加上分隔符 --
.
仅使用 grep 的替代方案:
grep -B3 '111AA2026' file | grep 'record\|"Symbol"\|--'