grep从html文件中提取url并以某种方式选择顶部

时间:2019-05-06 12:33:16

标签: awk grep html-parsing

我有很多(包括17,000个)包含链接的html文件。每个html文件可以包含许多链接,但是它们都引用相同的视频mp4,但分辨率不同。我只想grep出最高分辨率的链接,即。如果有对720、1080或1440的引用,则我希望1440的链接不干扰其他链接。不过,最大分辨率有所不同,因此我不能仅对1440进行硬编码(例如,一个html文件中的最大分辨率可能是720,例如另一个1440中的最大分辨率)。

每个html文件的内容在2k到80k之间,并具有重复的内容,这种内容具有这种结构,有时一行,有时跨越多行

{"url":"https://localhost/676/hg66333/56354446353.mp4?user=893668f5-8fab-4916-9697-f45aee61aa01", 
uploadedBy="fdb778f8-c347-4c28-90f4-d8be4b4a20f0", 
 owner="3ba62dba-8fb1-468d-8349-2e42a5330785",video="1024p", 
   group="a4307f09-4804-4802-9ba4-8e8eaf3d3439"},
   {"url":"https://localhost/676/hg66333/56354446384.mp4?user=893668f5-8fab-4916-9697-f45aee61aa01", 
 uploadedBy="fdb778f8-c347-4c28-90f4-d8be4b4a20f0", 
       owner="3ba62dba-8fb1-468d-8349-2e42a5330785",
    video="720p", group="a4307f09-4804-4802-9ba4-8e8eaf3d3439"}

我想要的grep就是

https://localhost/676/hg66333/56354446353.mp4?user=893668f5-8fab-4916-9697-f45aee61aa01

“不”(因为这是较低的分辨率,单个文件中的最高分辨率为i 1024,较低的是720)

https://localhost/676/hg66333/56354446384.mp4?user=893668f5-8fab-4916-9697-f45aee61aa01

我只是无法使用grep -oh和'\“ url \”:\“ https://localhost[ ^”] *

解决方案

我认为我需要做的是获取所有网址,然后将video =,按网址排序,然后将视频从最高到最低排序,然后排在最前,但是.....我不知道,现在只是尝试尝试在Google上找到的任何内容并进行更改。

有人可以帮忙吗?

哦,mp4总是出现在视频质量之前

我正在使用Darwin MacBook-Pro.local 18.6.0 Darwin Kernel版本18.6.0:PDT 2019年4月25日23:49:07;根目录:xnu-4903.261.4〜4 / RELEASE_X86_64 x86_64

1 个答案:

答案 0 :(得分:2)

使用标准UNIX工具,包括在任何UNIX盒上的任何shell中的任何awk:

$ cat tst.awk
BEGIN { OFS="\t" }
{
    while ( match($0,/("url":|[[:alpha:]]+=)"[^"]+"/) ) {
        tag = val = substr($0,RSTART,RLENGTH)
        $0 = substr($0,RSTART+RLENGTH)
        sub(/[:=].*/,"",tag)
        sub(/[^:=]*[:=]/,"",val)
        gsub(/^"|"$/,"",tag)
        gsub(/^"|"$/,"",val)
        f[tag] = val
        if ( tag == "video" ) {
            print f["video"], f["url"]
        }
    }
}

$ awk -f tst.awk file
1024p   https://localhost/676/hg66333/56354446353.mp4?user=893668f5-8fab-4916-9697-f45aee61aa01
720p    https://localhost/676/hg66333/56354446384.mp4?user=893668f5-8fab-4916-9697-f45aee61aa01
$
$ awk -f tst.awk file | sort -n
720p    https://localhost/676/hg66333/56354446384.mp4?user=893668f5-8fab-4916-9697-f45aee61aa01
1024p   https://localhost/676/hg66333/56354446353.mp4?user=893668f5-8fab-4916-9697-f45aee61aa01
$
$ awk -f tst.awk file | sort -rn
1024p   https://localhost/676/hg66333/56354446353.mp4?user=893668f5-8fab-4916-9697-f45aee61aa01
720p    https://localhost/676/hg66333/56354446384.mp4?user=893668f5-8fab-4916-9697-f45aee61aa01
$
$ awk -f tst.awk file | sort -rn | head -1
1024p   https://localhost/676/hg66333/56354446353.mp4?user=893668f5-8fab-4916-9697-f45aee61aa01
$
$ awk -f tst.awk file | sort -rn | head -1 | cut -f2
https://localhost/676/hg66333/56354446353.mp4?user=893668f5-8fab-4916-9697-f45aee61aa01

它所依赖的是任何给定的tag = value字符串本身都不是跨行的,它们都遵循您在问题中显示的格式。