存储在文件中的输出示例:
Provides: Red Hat Satellite
Red Hat Developer Toolset (for RHEL Server)
SKU: TGV123
Contract: 59104
Pool ID: abcdxyz12340987
从上面的输出中,我想查找“Red Hat Satellite”并查找包含“Pool ID:”的行,以便获得池 ID 的值,即 abcdxyz12340987。
如何使用 sed、awk 或 grep 获得此信息? “Pool ID”可能会出现在“Red Hat Satellite”之后的几行,即它们之间没有固定的行数。
非常感谢帮助!
答案1
sed -n '/Red Hat Satellite/,/Pool ID:/{ s/.*Pool ID:[[:blank:]]*\(.*\)/\1/p; }' file
这将应用一个替换,从 after 中挑选出您的字符串Pool ID:
。它在包含字符串的行Red Hat Satellite
和包含 的第一行之间的任何行上执行此操作Pool ID:
。该命令将仅打印任何成功替换的结果。
awk
如果行末尾的字符串Pool ID:
不包含任何空格,以下命令将执行相同的操作:
awk '/Red Hat Satellite/,/Pool ID:/ { if (/Pool ID:/) print $NF }' file
grep
不会是这项工作的工具,因为它不擅长处理上下文(“在另一行匹配的情况下提取一行”)。如果使用 GNU 在 nul 终止行上进行一些 PCRE grep
,它可能会起作用,但这将是一个 hack。
答案2
和awk
脚本编写:
$ awk '/Red Hat Satellite/{ f=1; next }f && /Pool ID:/{ print $NF; exit }' yourfile
abcdxyz12340987