Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash脚本:下载html文件,与以前的版本进行比较并显示差异_Html_Regex_Bash_Xslt_Diff - Fatal编程技术网

Bash脚本:下载html文件,与以前的版本进行比较并显示差异

Bash脚本:下载html文件,与以前的版本进行比较并显示差异,html,regex,bash,xslt,diff,Html,Regex,Bash,Xslt,Diff,本网站列出了一些可能随时间变化的IP地址。 现在我想编写一个bash脚本(必须是bash,不能使用python或PHP),它将下载上述html文件一次,然后在每次运行脚本时将新版本与旧版本进行比较。如果存在差异,则应显示该差异,并将其记录到文件中,然后在后续步骤中发送电子邮件通知 现在,理论上这似乎是一项简单的任务,但我无法产生任何结果。如果我能得到一些关于如何实现这一目标的想法,我将不胜感激 到目前为止,我已经尝试了以下方法: #!/bin/bash #check website for c

本网站列出了一些可能随时间变化的IP地址。

现在我想编写一个bash脚本(必须是bash,不能使用python或PHP),它将下载上述html文件一次,然后在每次运行脚本时将新版本与旧版本进行比较。如果存在差异,则应显示该差异,并将其记录到文件中,然后在后续步骤中发送电子邮件通知

现在,理论上这似乎是一项简单的任务,但我无法产生任何结果。如果我能得到一些关于如何实现这一目标的想法,我将不胜感激

到目前为止,我已经尝试了以下方法:

#!/bin/bash
#check website for changes

URL="https://support.symantec.com/en_US/article.TECH244698.html"



mv  new.html old.html 2> /dev/null
curl -v --silent $URL --stderr - > new.html
diff -y --suppress-common-lines new.html old.html


您可以使用以下bash脚本:

#!/bin/bash
#check website for changes

URL="https://support.symantec.com/en_US/article.TECH244698.html"


if [ -f new_ips.log ]; then
    mv  new_ips.log old_ips.log 2> /dev/null
fi

curl --silent "$URL" | \
grep -oP '\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(:?\/\d\d?)?\b' > new_ips.log

if [ -f new_ips.log ] && [ -f old_ips.log ]; then
        diff -y --suppress-common-lines new_ips.log old_ips.log
        exit 0;
fi

exit 1;
第一次需要运行它两次,因为最初没有什么可比较的

解释:

通过添加
grep-oP'\b(?:(?:25[0-5]| 2[0-4][0-9]|[01]?[0-9][0-9]?)\){3}(?:25[0-5]| 2[0-4][0-9]|[01]?[0-9][0-9](:?\/\d?)?\b'
只获取html文件的IP,您可以专注于您真正感兴趣的内容,避免在页面设计或时间戳等方面存在差异

我通过在重新运行之前修改新的_ips.log对其进行了测试,您有以下区别:

./check_ips.sh 
                                                              > 142.64.0.0/21
148.64.0.0/21                                                 | 142.64.0.1
148.64.0.1                                                    <
/check\u ips.sh
> 142.64.0.0/21
148.64.0.0/21                                                 | 142.64.0.1
148.64.0.1                                                    <

回答第二个问题,您想在IP地址中添加国家/地区列表。如
奥克兰、新西兰IP地址、悉尼、澳大利亚IP地址

我建议按以下方式更改提取/过滤命令:

curl --silent "$URL" |\
 awk 'BEGIN{print "<html><body>"}/<table/{a=1;}/<\/table>/{print;a=0}{if(a)print;}END{print "</body></html>"}' |\
 xsltproc -html generate_ips.xslt - | sed '/^Egress/{d};s/^ *//'
1) 我们需要使用解析器解析
HTML
文档(xslt技术足以满足我们的需要)

您可以使用
awk
提取所有表,并创建一个简化的html文件,其中只包含我们感兴趣的ip表。然后调用XSLT处理器生成输出,最后但并非最不重要的一点是,sed将删除不需要的行并清理显示

输出:

IP address range**
148.64.0.0/21**
148.64.0.0/21
148.64.0.1
148.64.7.254
Auckland, New Zealand
124.157.113.128/27 124.157.113.160/27 124.157.113.192/27
124.157.113.129 124.157.113.161 124.157.113.193
124.157.113.158 124.157.113.190 124.154.113.222
Chennai, India
180.179.40.0/26 180.179.46.64/27 148.64.6.0/23
180.179.40.1 180.179.46.65 148.64.6.1
180.179.40.62 180.179.46.94 148.64.7.254
Hong Kong
103.246.38.0/24 148.64.0.0/24
103.246.38.1 148.64.0.1
103.246.38.254 148.64.0.254
Mumbai, India
180.179.142.0/24 148.64.4.0/23
180.179.142.1 148.64.4.1
180.179.142.254 148.64.5.254
Seoul, South Korea
203.246.168.0/24
203.246.168.1
203.246.168.254
Shanghai, China
211.147.76.0/27 211.147.76.32/27
211.147.76.1 211.147.76.33
211.147.76.30 211.147.76.62
Singapore
103.246.37.0/24 148.64.3.0/24
103.246.37.1 148.64.3.1
103.246.37.254 148.64.3.254
Sydney, Australia
103.246.36.0/24
103.246.36.1
103.246.36.254
Taipei, Taiwan
61.58.46.0/24
61.58.46.1
61.58.46.254
Tokyo, Japan
103.9.99.0/24 103.246.39.0/24 148.64.1.0/24 
103.9.99.1 103.246.39.1 148.64.1.1
103.9.99.254 103.246.39.254 148.64.1.254

脚本的其余部分不应更改,并且可以正常工作

谢谢,但我一直在寻找一种方法来提取IP地址(这是html中唯一我感兴趣的部分),你到底想要哪个IP?表中IP子网下的IP地址或所有IP地址?目标是监视此页上列出的所有IP地址。Allan,感谢您的输入。这正好为我提供了所有后续步骤所需的输出,例如屏幕上的通知和电子邮件等。我可以问另一个问题吗?我想将过去的日志归档在一个单独的文件夹中,最好在日志文件或文件名中加上时间戳。我想这可以通过date命令来实现。因此,现在我创建了一个cronjob,每天运行一次这个脚本,比如说每天早上8点,我希望有一周的日志(轮换)-例如,在一周结束时,文件夹应该包含Mon_u&date_u日志、Tue_uuu%date_u日志等等-下一周它应该覆盖这些文件。使用bash脚本可以实现此行为吗?@i716:是的,您应该使用带有选项的
find
命令来查找所有早于特定时间戳的文件并移动/压缩它们。使用
exec
选项或
xargs
:-)我添加了以下行
DATE=$(DATE+%Y%m%d%H%m”),如果[-f new_ips.log];然后对第一个任务使用cp new_ips.log logfiles/$DATE.log mv new_ips.log old_ips.log 2>/dev/null fi
。它会在每次运行脚本时创建日志文件。实际上,工作日并不是必须的。我会找到一个方法来实现这一点。但是回到Regex,有没有一种可行的方法将国家名称与IP地址包括在一起?e、 奥克兰,新西兰IP地址,悉尼,澳大利亚IP地址?艾伦,你太棒了!非常感谢。但我想问一下,第1)部分应该在哪里实施?也许我应该提到,系统上不能安装任何外部软件,因此我要求在bash脚本中完成这一切。关于第1部分,只需创建一个名为
generate\u ips.xslt
的文件,并在其中写入内容。您的系统上应该有一个XSLT处理器命令。您是否有
xsltproc
xalan
saxon
?如果您有
xsltproc
,如果您没有检查机器上安装的xsltproc并使用命令更改xsltproc,则无需更改任何内容<代码>$more generate\u ips.xslt只是命令
more
和您的
文件名
(读取文件内容lol)文件的第一行
generate\u ips.xslt
应该是
而不是
more generate\u ips.xslt
,我真是太愚蠢了,没有意识到lol对不起。它的工作原理是在屏幕上显示输出,但不将其写入文件。出于测试目的,我简化了脚本。它现在只需卷曲URL,后跟最新的代码,然后是昨天的正则表达式,后跟一个
>文件名。
curl --silent "$URL" |\
 awk 'BEGIN{print "<html><body>"}/<table/{a=1;}/<\/table>/{print;a=0}{if(a)print;}END{print "</body></html>"}' |\
 xsltproc -html generate_ips.xslt - | sed '/^Egress/{d};s/^ *//'
IP address range**
148.64.0.0/21**
148.64.0.0/21
148.64.0.1
148.64.7.254
Auckland, New Zealand
124.157.113.128/27 124.157.113.160/27 124.157.113.192/27
124.157.113.129 124.157.113.161 124.157.113.193
124.157.113.158 124.157.113.190 124.154.113.222
Chennai, India
180.179.40.0/26 180.179.46.64/27 148.64.6.0/23
180.179.40.1 180.179.46.65 148.64.6.1
180.179.40.62 180.179.46.94 148.64.7.254
Hong Kong
103.246.38.0/24 148.64.0.0/24
103.246.38.1 148.64.0.1
103.246.38.254 148.64.0.254
Mumbai, India
180.179.142.0/24 148.64.4.0/23
180.179.142.1 148.64.4.1
180.179.142.254 148.64.5.254
Seoul, South Korea
203.246.168.0/24
203.246.168.1
203.246.168.254
Shanghai, China
211.147.76.0/27 211.147.76.32/27
211.147.76.1 211.147.76.33
211.147.76.30 211.147.76.62
Singapore
103.246.37.0/24 148.64.3.0/24
103.246.37.1 148.64.3.1
103.246.37.254 148.64.3.254
Sydney, Australia
103.246.36.0/24
103.246.36.1
103.246.36.254
Taipei, Taiwan
61.58.46.0/24
61.58.46.1
61.58.46.254
Tokyo, Japan
103.9.99.0/24 103.246.39.0/24 148.64.1.0/24 
103.9.99.1 103.246.39.1 148.64.1.1
103.9.99.254 103.246.39.254 148.64.1.254