awk、sed和正则表达式的简单使用

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

1.在互联网上搜索北京PM2.5找到网站https://tianqi.2345.com/air-54511.htm,通过浏览器的调试模式定位到各监测站的PM2.5浓度的html格式。
在这里插入图片描述

2.登录ubantu服务器,用wget命令获得该网站的html源码。
在这里插入图片描述

3.通过检查html文件发现,日期和时间位于不同的位置
在这里插入图片描述
在这里插入图片描述

因此要将日期和时间拼起来需要定位到两行。

4.检查PM2.5浓度,发现PM2.5浓度位于
在这里插入图片描述

并且需要的地点名称和对应PM2.5浓度在不同的两行上。

5.因为sed和awk都是以行为单位执行的,因此考虑先将时间和地点名称以及PM2.5所在四行合并成一行,写出awk脚本如下,经过awk脚本,包含日期、时间、地点名称、PM2.5浓度的四行会合并成一行,方便后续更改格式。
执行file.awk脚本后,输出文件如下,
cat air-54511.htm | awk -f file.awk
在这里插入图片描述

可见,需要的日期,时间,地点名称,PM2.5浓度已经合并为一行。

file.awk脚本解释:

# 最先开始执行,初始化一些变量
BEGIN{
    # 用来存储日期那行
    date="";
    # 用来存储时间那行
    time="";
    # 记录标记某个地区名称的行号
    line = 99999;
    # 记录包含某个地区名称和包含PM2.5的两行
    linetxt = "";
}

# 对每一行执行一下操作,经过以下操作,包含日期,时间,地点名称,PM2.5浓度会合并成一行,方便后续更改格式
{
    # 判断是否是日期那行,如果是把这行赋给date
    if($0~/date-nongli/){
        date=$2;
        }
    # 判断是否是时间那行, 如果是把这行赋给time,并加上时间秒
    else if($0~/box-mod-th-right-tips/){
        time=$4":00";
        }
    # 判断是否是包含地区名称那行,如果是标记行号line, 把这行赋给linetxt
    else if($0~/left-txt/ && $0!~/监测站点/){ 
        linetxt = "";
        line = NR;
        linetxt = linetxt""$0;
    }
    # 判断是否是地区下的第二行(包含PM2.5浓度),如果是,把包含日期,时间,地点名称,PM2.5浓度的四行合并成一行打印
    else if(NR==line+2){
            print date time linetxt $0 "\n";
        }
    }
}

6.最后使用sed命令把每一行替换成我们想要的格式,
sed命令为:

sed 's/c.*>\(.*\)<b>.*\/div>\(.*:00\).*\"left-txt\">\(.*\)<\/td>.*<td>\(.*[0-9]\)<\/td>/\1 \2,\3,\4/g'

7.最后所有指令执行效果如下,

cat air-54511.htm | awk -f file.awk | sed 's/c.*>\(.*\)<b>.*\/div>\(.*:00\).*\"left-txt\">\(.*\)<\/td>.*<td>\(.*[0-9]\)<\/td>/\1 \2,\3,\4/g' 

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值