工控网络基础入门篇之SED 配合正则表达式使用

正则表达式是一件屠龙神器,但是要把它讲好非常困难,建议是阅读这篇正则表达式 30 分钟入门,这是目前见过最好的正则表达式入门的文章了。在本文中,只介绍一个 SED 配合正则表达式使用的例子,介绍一点基本的概念,因为如果你完全不了解正则表达式,这几个命令在你看起来可能会跟天书一样难懂。

如何从 greatfire.org 网站上抓取在被屏蔽率超过 70% 的网站域名,然后生成用于 FreeRouter V2 的配置文件,这个脚本的代码如下:

看不懂没关系,一行行解释:

1. set -x 表示打开调试,方便查看脚本运行信息

2. 刚开始是清理掉之前的输出文件

3. Threshold=70 是一个表示屏蔽率的变量,我们说了是 70%

4. curl -s –insecure...... 是用 curl 下载一个网页,-s 表示静默模式工作,–insecure 是因为这是个 https 网页,因为一些证书的问题我用这个选项绕过去

5. 最后面的 $i 表示上面从 1 到 9 的数字,因为要抓很多个页面

6. 另外提一下,openwrt 的 shell 是 ash,非常精简也很简陋,连 for 循环都只能这样一个个的写那个网页中,关于被屏蔽的网站部分的源码是这样的:

继续解释:

1. grep ’class=first’| grep ’class=”blocked”’ 是表示把网页众多行的源码中,包含这两个字符串的行提取出来,

2. grep -vE ”google” 是表示把包含 google 这个字符串的行剔除掉 (因为 Google 太多子域名了,我觉得没必要全部提取)

1. SED 是基于一行一行输入的流编辑工具,-e 是为了使用多个命令,其实这里没必要.

2. 后面的 s# 一大堆东西 # 又是一大堆 #g 是 VIM 用户很熟悉的查找替换命令,我们的目的是把域名和屏蔽率提取出来.

3. ̂表示一个字符串的开始,然后中间通过一次次的反斜线逐步往后定位.

4. 用括号括起来的部分,就是一个分组,这里的分组 1 就是域名,分组 2 就是被屏蔽率

1. 你可以认为 awk 是一个类似 excel 的工具,他可以把输入的数据按列进行处理

2. $2 就是分组 2,也就是被屏蔽率,我们和设定的 70 去比较,就是说如果屏蔽率大于 70% 就进行后面的操作

3. 如果被屏蔽率大于 70%,就在 $1,也就是域前后分别添加一些别的字符,最终组成我们要的配置文件