最近在学 linux shell 一直学不会 sed 与 grep 的用法,希望大佬指点一下
打算用来提取 html 里面的内容,测试代码如下
<tr border=0>
<tr><td valign=top>
<div id="leftside">
<div class="clear">
</div>
<div id="playvideo">
<div id="playvideo-videoname">
韩式 Sussi
</div>
<div id="playvideo-content">
<div class="arrow-general">
</div>
<div class="videoplayer">
<video id="vid" class="video-js vjs-default-skin vjs-big-play-centered"
controls preload="auto" width="465" height="360"
poster="http://img2.aliyun.com/thumb/FA13AS3456XVB.jpg" >
<source src="http://v.advideos.com//mp43/FA13AS3456XVB.mp4?st=boGNNUn6--7TxTJJ8uKtjA&e=1518240294" type='video/mp4'>
</div>
</div>
</div>
</div>
</div>
</tr>
</table>
1、想要提取
<div id="playvideo-videoname">
韩式 Sussi
</div>
里面的 韩式 Sussi
2、和
<source src="http://v.advideos.com//mp43/FA13AS3456XVB.mp4?st=boGNNUn6--7TxTJJ8uKtjA&e=1518240294" type='video/mp4'>
里面的 http://v.advideos.com//mp43/FA13AS3456XVB.mp4?st=boGNNUn6--7TxTJJ8uKtjA&e=1518240294 url ,当面页面里面可能有好几个
听说 sed 只能按行来提,这样的话第一个要提取的内容老是提不出来。第二个因为是在 src 里面而且通配另一个字串,原谅我正则表达 式真的看不懂。
请大佬们解惑。
1
loginv2 2018-02-10 08:59:24 +08:00 via Android
都不用.用 awk
|
2
loginv2 2018-02-10 09:00:56 +08:00 via Android
好像也不对,话说回来正常情况下不应该用正则,应该解析 xml
|
3
brotherlegend OP @loginv2 那如果 html 格式不规范的话 解析岂不是会失败?
|
4
nightcat 2018-02-10 09:07:57 +08:00
sed -A1 是加上匹配条目的后一行,sed -B1 是加上前一行,行数可以换,应该能满足你第一条要求。。。
|
6
mingongge 2018-02-10 09:22:52 +08:00
专注于 linux 系统运维、运维架构、各类高可用技术,热衷于分享开源技术,热爱开源、拥抱开源!!我是 80 后民工哥,微信公众号:民工哥 linux 运维,我为自己代言,谁说 80 后不能活出精彩人生!!!
关于 命令三剑客的文章可以参考下面的链接 https://mp.weixin.qq.com/s?__biz=MzI0MDQ4MTM5NQ==&mid=2247484807&idx=1&sn=9fd2359b67d45aa9ea3f23231a19dc1c&chksm=e91b609bde6ce98d000b7e377867c6d45a56eb85343dfd345c8a38f7180f850f0956ff972add#rd |
7
boboliu 2018-02-10 09:39:46 +08:00
为啥不直接 beautifulsoup 呢。。。
|
8
iac 2018-02-10 09:40:14 +08:00
sed -n '/playvideo-videoname/,+2{/1/n;p}' test.log
|
9
lulinux 2018-02-10 09:51:36 +08:00
sed 功能稍微强大一点。
|
10
singer 2018-02-10 10:04:11 +08:00 via iPhone
awk 正则
|
11
uyhyygyug1234 2018-02-10 10:11:44 +08:00
pyquery bs4 啊!!
|
12
jianguiqubaa 2018-02-10 10:19:13 +08:00 1
https://github.com/ericchiang/pup
“ pup is a command line tool for processing HTML. It reads from stdin, prints to stdout, and allows the user to filter parts of the page using CSS selectors. Inspired by jq, pup aims to be a fast and flexible way of exploring HTML from the terminal. ” 另外一个思路 |
13
wampyl 2018-02-10 10:22:30 +08:00 via iPhone
bs4 吧。或者 sed 提取出.mp4 那一行,然后再用 awk 处理
|
14
jianguiqubaa 2018-02-10 10:26:55 +08:00
|
15
lance6716276 2018-02-10 11:00:15 +08:00 via Android
HTML 不是正则语言吧…
|
16
wweir 2018-02-10 12:00:22 +08:00 1
|
18
xiaq 2018-02-10 12:03:28 +08:00 via iPad
|
19
coolxl 2018-02-10 12:03:47 +08:00
第一个:过滤出关键字 “ playvideo-videoname ”的下一行 grep -A 1 ‘ playvideo-videoname ’ file
第二个:过滤出关键字“ source src ”的行,再 awk 用 “ 作分隔符,取第二段。grep 'source src' |awk -F '"' '{print $2}' file |
20
brotherlegend OP @boboliu 如果用 python 就简单啦,就是只想用 shell
|
21
brotherlegend OP @wweir 请收下我的膝盖,完美解决,我研究研究代码的意思
|
22
brotherlegend OP @coolxl 谢谢 等会试试
|
24
brotherlegend OP @liuxu 简单粗暴,牛
|
25
artandlol 2018-02-10 15:20:21 +08:00 via iPhone
|
26
pkookp8 2018-02-10 19:14:51 +08:00 via Android
grep -v \<
第一题,不知道是不是取巧了 |
27
pkookp8 2018-02-10 19:18:03 +08:00 via Android
突然发现楼主标题字母顺序反了...
|
28
abscon 2018-02-10 19:50:48 +08:00 via iPhone
三个问题:
1. ilnux shell 什么鬼?不存在的。 2. linux shell 什么鬼?不存在的。 3. 为什么要用正则来解析 HTML ?用个解析器不好么? |
29
likuku 2018-02-10 23:47:02 +08:00
少年误入歧途了...
|
30
kualalumpur 2018-02-11 00:28:22 +08:00 1
#!/usr/bin/env bash
# 一个使用 awk 和正则的解决方案 # HTML 文件变量 FILE="file.html"; cat $FILE | # 显示 HTML 文件内容 awk 'in_range && /<\/div>/ { # 结束标记 gsub(/^\s+/, "", str); #去掉开头空白 gsub(/\s+$/, "", str); #去掉尾部空白 print str; exit; } in_range { # 需要的内容 str=str $0; # awk 用空格连接字符串 } /playvideo\-videoname/ { # 开始标记 in_range=1; }'; cat $FILE | # 显示 HTML 文件内容 awk '/http(.+)\.mp4/ { # 匹配行 prefix=index($0, "http"); #查找 url=substr($0, prefix); # 移头 suffix=index(url, "\""); #查找 url=substr(url, 1, suffix - 1); # 去尾 print url; # 显示出来 }'; |
31
kualalumpur 2018-02-11 00:30:12 +08:00 1
|
32
feichao 2018-02-11 00:56:43 +08:00 1
如果不一定要用正则的话,用 HTML 解析工具会更方便一些
用 temme 的话这个挺方便的: https://runkit.com/shinima/snippet-for-ilnux-shell 需要先在命令行用 yarn/npm 安装 temme |
33
matsuz 2018-02-11 04:11:08 +08:00 via iPhone
XPath, CSS 选择器了解一下
|
34
brotherlegend OP @abscon 嗯 一根筋 就是只用 shell 不打算用任何第三方
|
35
brotherlegend OP @kualalumpur 这个我看得懂哈哈谢谢
|
36
abscon 2018-02-11 09:51:22 +08:00 via iPhone 2
@brotherlegend
首先,shell 有很多种,你说的具体是哪个 shell。不同的 shell 可能有不同的语法,脚本在某个 shell 能跑,另一个可能就不行; 其次,shell 又不是专为 Linux 开发的,请不要用「 Linux shell 」这么奇怪的称呼。你学的「 Linux shell 」的经验,相当一部分都能在其他操作系统上用到; 再次,sed 和 awk 都是独立的程序,在不同的 shell 上都能用,你学的并不是 shell 而是 sed 程序和 awk 程序; 最后,正则语言相比 html 来说是有点 low 的,不一定能满足要求,想省心省力最好用 html parser。 |
37
brotherlegend OP @abscon 批评的是,不过这样写我的 vps
都能直接运行就 ok 拉 |
38
brotherlegend OP @feichao 谢谢
|
39
gpw1987 2018-02-15 11:58:06 +08:00
sed 取行,awk 取列
|