如何从shell脚本中的html表中提取数据?

新手上路,请多包涵

我正在尝试创建一个 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 许可协议

阅读 1.1k
2 个回答

使用 (g)awk ,它有能力:-),这是一个解决方案,但 _请注意_:它只适用于您发布的确切 html 表格格式。

  awk -F "</*td>|</*tr>" '/<\/*t[rd]>.*[A-Z][A-Z]/ {print $3, $5, $7 }' FILE

您可以在这里看到它的实际效果: https ://ideone.com/zGfLe

一些解释:

  1. -F 将输入字段分隔符设置为正则表达式(任何 tr 的或 td 的开始或结束标记

  2. 然后只适用于匹配这些标签和至少两个大写字段的行

  3. 然后打印所需的字段。

HTH

原文由 Zsolt Botykai 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用 bash xpathXML::XPath perl 模块)非常轻松地完成该任务:

 xpath -e '//tr[position()>1]' test_input1.xml 2> /dev/null | sed -e 's/<\/*tr>//g' -e 's/<td>//g' -e 's/<\/td>/ /g'

原文由 Emiliano Poggi 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题