我正在尝试创建一个 BASH 脚本,该脚本将从 HTML 表中提取数据。下面是我需要从中提取数据的表格示例:
<table border=1>
<tr>
<td><b>Component</b></td>
<td><b>Status</b></td>
<td><b>Time / Error</b></td>
</tr>
<tr><td>SAVE_DOCUMENT</td><td>OK</td><td>0.406 s</td></tr>
<tr><td>GET_DOCUMENT</td><td>OK</td><td>0.332 s</td></tr>
<tr><td>DVK_SEND</td><td>OK</td><td>0.001 s</td></tr>
<tr><td>DVK_RECEIVE</td><td>OK</td><td>0.001 s</td></tr>
<tr><td>GET_USER_INFO</td><td>OK</td><td>0.143 s</td></tr>
<tr><td>NOTIFICATIONS</td><td>OK</td><td>0.001 s</td></tr>
<tr><td>ERROR_LOG</td><td>OK</td><td>0.001 s</td></tr>
<tr><td>SUMMARY_STATUS</td><td>OK</td><td>0.888 s</td></tr>
</table>
我希望 BASH 脚本像这样输出它:
SAVE_DOCUMENT OK 0.475 s
GET_DOCUMENT OK 0.345 s
DVK_SEND OK 0.002 s
DVK_RECEIVE OK 0.001 s
GET_USER_INFO OK 4.465 s
NOTIFICATIONS OK 0.001 s
ERROR_LOG OK 0.002 s
SUMMARY_STATUS OK 5.294 s
怎么做?
到目前为止,我已经尝试使用 sed,但我不知道如何很好地使用它。我使用 grep "<tr><td>
用 grep 排除的表的标题(组件、状态、时间/错误),因此只有以 <tr><td>
开头的行将被选择用于下一次解析 (sed)。这就是我使用的: sed 's@<\([^<>][^<>]*\)>\([^<>]*\)</\1>@\2@g'
但是之后 <tr>
标签仍然存在并且它不会分隔字符串。换句话说,这个脚本的结果是:
<tr>SAVE_DOCUMENTOK0.406 s</tr>
我正在处理的脚本的完整命令是:
cat $FILENAME | grep "<tr><td>" | sed 's@<\([^<>][^<>]*\)>\([^<>]*\)</\1>@\2@g'
原文由 Marko 发布,翻译遵循 CC BY-SA 4.0 许可协议
使用
(g)awk
,它有能力:-),这是一个解决方案,但 _请注意_:它只适用于您发布的确切 html 表格格式。您可以在这里看到它的实际效果: https ://ideone.com/zGfLe
一些解释:
-F
将输入字段分隔符设置为正则表达式(任何tr
的或td
的开始或结束标记然后只适用于匹配这些标签和至少两个大写字段的行
然后打印所需的字段。
HTH