Regex 使用curl和grep/sed/awk在HTML标记中获取时间
我正试图从这个网页中提取到达时间。我正在OSX 10.9.5的终端上运行这个 我已经到了只隔离标签的地步Regex 使用curl和grep/sed/awk在HTML标记中获取时间,regex,bash,curl,awk,sed,Regex,Bash,Curl,Awk,Sed,我正试图从这个网页中提取到达时间。我正在OSX 10.9.5的终端上运行这个 我已经到了只隔离标签的地步 curl 'www.flyokc.com/arrivals.aspx' | grep 'labelTime' 然而,我在正则表达式方面很糟糕,所以我还没有从这些标签中抓取时间。我该怎么做呢 最后,我想按一天中的小时对它们进行分组,并按小时显示到达的数量,按降序排列。令人伤心的是,这似乎在此时对您的用例起作用: gawk ' BEGIN{ PROCINFO["sorted_in"]
curl 'www.flyokc.com/arrivals.aspx' | grep 'labelTime'
然而,我在正则表达式方面很糟糕,所以我还没有从这些标签中抓取时间。我该怎么做呢
最后,我想按一天中的小时对它们进行分组,并按小时显示到达的数量,按降序排列。令人伤心的是,这似乎在此时对您的用例起作用:
gawk '
BEGIN{
PROCINFO["sorted_in"]="@ind_num_asc"
FS="[<>: ]+"
}
/labelTime/&&/ContentPlaceHolderMain/{
if($6="PM") a[$4+12]+=1
else a[$4]+=1
}
END{
for(h in a)
print h, a[h]
}' <(curl 'www.flyokc.com/arrivals.aspx' 2>/dev/null)
gawk'
开始{
PROCINFO[“排序在”]=“@ind\u num\u asc”
FS=“[:]”
}
/labelTime/&&/ContentPlaceHolderMain/{
如果($6=“PM”)a[$4+12]+=1
否则a[$4]+=1
}
结束{
对于(a中的h)
打印h,a[h]
}'/dev/null)
编辑:说明什么有效为什么:
- 将字段分隔符设置为html分隔符、间距和HH:MM分隔符
- 然后抓取第六个字段(小时) (这只是在某种意义上你要求的正则表达式…)
- 如果第六个字段为“PM”,则添加12小时(您希望在最后进行数字排序)+1那一小时的计数
- 处理输入后,显示结果。由于数组访问顺序已定义为按键进行数字排序,因此无需使用外部排序命令
gawk '
BEGIN{
PROCINFO["sorted_in"]="@ind_num_asc"
FS="[<>: ]+"
}
/labelTime/&&/ContentPlaceHolderMain/{
if($6="PM") a[$4+12]+=1
else a[$4]+=1
}
END{
for(h in a)
print h, a[h]
}' <(curl 'www.flyokc.com/arrivals.aspx' 2>/dev/null)
gawk'
开始{
PROCINFO[“排序在”]=“@ind\u num\u asc”
FS=“[:]”
}
/labelTime/&&/ContentPlaceHolderMain/{
如果($6=“PM”)a[$4+12]+=1
否则a[$4]+=1
}
结束{
对于(a中的h)
打印h,a[h]
}'/dev/null)
编辑:说明什么有效为什么:
- 将字段分隔符设置为html分隔符、间距和HH:MM分隔符
- 然后抓取第六个字段(小时) (这只是在某种意义上你要求的正则表达式…)
- 如果第六个字段为“PM”,则添加12小时(您希望在最后进行数字排序)+1那一小时的计数
- 处理输入后,显示结果。由于数组访问顺序已定义为按键进行数字排序,因此无需使用外部排序命令
awk
使用curl
应该可以:
curl -s 'http://flyokc.com/arrivals.aspx' | awk '/labelTime/{print substr($2,68,5),substr($3,1,2)}'
输出:
12:47 PM
...
工作原理:
CURL
以静默方式获取网页的源代码,然后AWK
获取输出并使用“labelTime”选择包含到达时间的行。由于awk获取字符串所在的整个
,因此子字符串用于从位置68开始,然后打印结果。如果您只是想获取到达时间,如12:00 PM等。awk
与curl
配合使用应该可以:
curl -s 'http://flyokc.com/arrivals.aspx' | awk '/labelTime/{print substr($2,68,5),substr($3,1,2)}'
输出:
12:47 PM
...
工作原理:
CURL
以静默方式获取网页的源代码,然后AWK
获取输出并使用“labelTime”选择包含到达时间的行。由于awk获取字符串所在的整个
,子字符串用于从位置68开始,然后打印结果。您的意思是curl'www.flyokc.com/arrivals.aspx'| grep-oP'labelTime'>\K[^]*'
?它不像curl'www.flyokc.com/arrivals.aspx'| grep-oP'labelTime'>\K[^]*'0用法:grep[-abcDEFGHhIiJLlmnOoPqRSsUVvwxZ][-A num][-B num][-C[num]][-e pattern][-f file][-二进制文件=value][-color=when][-context[=num][-directories=action][-label][-line-buffered][-null][pattern][file…]5 310k 5 17079 0 0 33998 0:00:09----0:00:09 33954 curl:(23)写入正文失败(0!=1448)请尝试使用xmllint解析html/xml。您的意思是curl'www.flyokc.com/arrivals.aspx'| grep-oP'labelTime'>\K[^]*.
?它不喜欢curl'www.flyokc.com/arrivals.aspx'.\grep-oP'labelTime'>\K[^]*'0用法:grep[-abcdefghijllmnoopqrsuvwxz][-A][-num B num][-C][-e pattern][-e][-e][-f-labelTime][-binary file=value][--color=when][--context[=num][--directories=action][--label][--line buffered][--null][pattern][file…]5 310k 5 17079 0 33998 0 0 0:00:09--:---0:00:09 33954 curl:(23)写入正文失败(0!=1448)试着用xmllint解析html/xml。我从中得到的输出如下:22102342431314141471513131317171819205216这是一天中的小时数和计数,对吗?我从中得到的输出如下:2210234243131314141431617181985216这是一天中的小时数和计数,对吗?这是正确的,谢谢。另一个答案按小时分组并输出计数,但我后来添加了该请求。我感谢您的回答。这是正确的,谢谢。其他答案按小时分组并输出计数,但我后来添加了该请求。我感谢您的回答。