Sherroe's Blog

Linux作业 正则表达式

字数统计: 808阅读时长: 3 min
2022/04/07

[TOC]

题目要求

从因特网上搜索相关Web网页,处理网页html数据,从中提取出当前时间点北京各监测站的PM2.5浓度,输出格式如下。要求:写出各个处理步骤,并给出解释。

2020-03-09 13:00:00,海淀区万柳,73

2020-03-09 13:00:00,昌平镇,67

2020-03-09 13:00:00,奥体中心,66

2020-03-09 13:00:00,海淀区万柳,73

2020-03-09 13:00:00,昌平镇,73

2020-03-09 13:00:00,奥体中心,75


使用wget命令获取网页内容

1
wget http://www.86pm25.com/city/beijing.html

img


使用cat命令查看生成的文件内容

1
cat beijing.html

img

img


使用sed命令将HTML中的标签内容替换为空格

使用正则表达式 <[^>]*> 找出所有标签

进行这一步是为了更方便地找到所需要的文字内容

1
cat beijing.html | sed 's/<[^>]*>/ /g'

img

img

img


编写正则表达式

可以看到,需要的包含时间的行都包括 “更新:” 这个字符串

需要的包含pm2.5数据的行都包括 “数字μg” 这个字符串

使用正则式表达则分别为:更新:[0-9][0-9]*μg

使用grep命令验证如下:

img

img

可以发现其中时间行的第1域和第2域分别为日期和时间

数据行的第1域和第3域分别为地点和pm2.5浓度


编写awk文件

使用vim命令编写a.awk文件

1
vim a.awk

生成一个名为a.awk的文件并进入vim编辑模式

按下i进入输入模式,按下x删除当前光标所在处的字符,按下:进入底线命令模式(输入命令)

在insert输入模式下,按下 Esc 键退出输入模式进入命令模式

在底线命令模式下,w保存文件,q退出程序

img

编辑a.awk文件如下:

1
/更新:/{d=$1;t=$2;}/[0-9][0-9]*μg/{printf("%s,%s,%s,%s\n",d,t,$1,$3);}

其中将通过正则表达式更新:找到的时间行的第一域(日期)保存为变量d,将第二域(时间)保存为变量t,最后和通过正则表达式[0-9][0-9]*μg找到的数据行的第一域(地点)和第三域(pm2.5浓度)同时输出。

img

使用awk命令进行输出:

1
cat beijing.html | sed 's/<[^>]*>/ /g' | awk -f a.awk

img


修改为标准格式

对比题目中给出的标准输出格式,修改如下:

将多余的字符 更新:日,μg/m³ 删除

替换为 -

替换为 :00:00

1
cat beijing.html | sed 's/<[^>]*>/ /g' | awk -f a.awk | sed -e 's/更新:/ /g' -e 's/年/-/g' -e 's/月/-/g' -e 's/日,/ /g' -e 's/时/:00:00/g' -e 's/μg\/m³/g'

注意其中μg/m³中的/需要转义,应写为μg\/m³

并且由于之前的a.awk文件是基于消除HTML标签后的内容进行编写的,所以必须要先消除<>标签后再使用awk,不能将消除<>的sed命令和之后的sed -e命令合并。

最后成功输出如图所示:

img

CATALOG
  1. 1. 题目要求
  2. 2. 使用wget命令获取网页内容
  3. 3. 使用cat命令查看生成的文件内容
  4. 4. 使用sed命令将HTML中的标签内容替换为空格
  5. 5. 编写正则表达式
  6. 6. 编写awk文件
  7. 7. 修改为标准格式