【资料名称】:【XC原创】Unix Raid OSS数据自动提取工具
【资料作者】:ZengFang
【资料日期】:2012年1月
【资料语言】:中文
【资料格式】:DOC/DOCX
【资料目录和简介】:
Unix Raid数据提取脚本是早期为了解决项目组提取MRR、NCS数据效率低下的问题制作的,它是基于UNIX操作系统的脚本,脚本虽然简单却极大的提高了我们的取数工作效率,结合ActiveManagement更可以达到无人值守的效果,这个脚本比较适合大的地市,如广州、东莞、深圳、佛山这种有上100个网元的地市。以下是脚本的详细说明:
前言:基于系统安全性能、多用户操作、进程资源分配等多方面因素考虑,很多厂家都是基于Unix平台建立他们的维护终端,这里包括爱立信的OSS终端,Unix系统与我们常用的Windows系统相比,在操作界面、软件应用及系统开发上都有很大的区别。
一、Unix Raid与OPS提取思路的区别
我们日常收取爱立信NCS、MRR、FAS时是采用OPS脚本定义、提取和转存的,这里介绍的提取脚本主要是针对第三个步骤“转存”而来的,如下图为常用OPS数据转存方法示意图:
1.通过Unix系统下的OSS终端软件访问BSC并激活转存数据指令;
2.接到转存指令后,BSC将硬盘的数据上传到Unix系统中的OSS文件夹;
[attach]312042[/attach]
OSS系统中自带的OPS系统是采用逐条指令执行方式,在提取数据时要等一个BSC的文件上传完成后才能执行下一个BSC文件上传指令(红色线流程所示),因此在数据转存过程中存在一定的延时,若遇到BSC Function Busy或网络连接故障时,就会出现后面指令无法执行,从而导致大量BSC数据无法及时转存的情况;
UnixRaid的解决方案是绕过爱立信OSS系统,直接在Unix中访问BSC硬盘,获取文件列表并使用“Ctrl+C”和“Ctrl+V”完成数据上传任务,将以上思路转化成自动化脚本或程序便可完成数据自动提取到目标地址后完成数据转存工作。这样的操作不会受OSS的任何限制,即使无法连接BSC或BSC出现Function Busy也不会导致后面脚本无法执行的情况,如下图Unix Raid数据转存方法示意图:
[attach]312043[/attach]
1.通过Unix直接访问BSC硬盘,获取目标文件名称列表;
2.将目标文件直接下载到指定OSS目录下;
3.两种方法相比,Unix Raid最大的特点在于:
测量文件提取速度快;
个别网元遇错后不会影响其它网元的指令执行;
单个脚本即可完成所有数据转存任务;
二、Unix Raid核心模块介绍
Unix Raid是基于Unix系统编写的数据提取脚本,脚本分开三个模块,分别是:引导模块、关键模块和访问模块,Unix Raid核心模块工作流程如下图所示:
[attach]312044[/attach]
Unix Raid核心的三个模块工作流程如下:
根据启动时间创建存放测量数据的文件夹;
循环引导每个BSC激活【关键模块】;
根据启动时间判断所取数据类型并设置时间、日期门限值;
激活【访问模块】;
根据不同文件类型获取远端目录文件的详细列表;
返回【关键模块】,根据相关时间、日期的门限从【访问模块】中获取到的列表中索引符合条件的目标文件名称;
根据文件名称从远端目录下提取目标文件并存放到指定目录下;
生成LOG信息,返回【引导模块】执行下一个BSC数据提取;
三、Unix Raid工具架设方法
在架设Unix Raid工具之前首先要对当前的环境情况进行了解和分析,从而选择正确的设置方法,需分析的相关信息如下:
整理所需提取数据类型及时间;
了解测量数据源文件存放位置;
若在BSC硬盘则需要APG网元的FTP登录名称及密码;
若在OSS硬盘上则要了解具体的地址及文件排列方式;
本地OSS存放测量数据地址;
下面以广州环境为例介绍架设Unix Raid的详细设置方法:
[attach]312045[/attach]
广州项目组每天需要分6个时段收集7份测量数据,相关信息如以上图表所示,以上数据的输出时间各不相同,因此可以作为判断输出数据类型的依据,具体的指令及解析如下:
(一)、 引导模块相关指令设置及指令作用解释:
#!/bin/sh
NOW_DATE=`date'+%Y-%m-%d_%p'` 【获取当前日期并赋值给变量NOW_DATE】
Now_Time=`date '+%H'`【获取当前时间,用为判断采集数据类型】
if [ $Now_Time = 12];then【若当前时间为19时(小时),则提取早忙常规MRR&NCS】
FileName=`date'+%Y-%m-%d'`"_MRR&NCS_AM"【给变量FileName赋值为当前日期_MRR&NCS_AM】
cd /home/liu_yh2/cha/CopyMRFile【打开目录/home/liu_yh2/cha/CopyMRFile】
mkdir $FileName 【创建FileName变量为内容的文件夹】
cd /home/liu_yh2/cha/CopyMRFile/$FileName【打开创建好的文件夹】
mkdir 'FileList' 【在新创建的文件夹下创建FileList文件夹】
mkdir 'MRR'【创建MRR文件夹存放MRR数据】
mkdir 'NCS'【创建NCS文件夹存放NCS数据】
elif
[ $Now_Time = 19 ];then【若当前时间为19时(小时),则提取下行质差MRR】
FileName=`date '+%Y-%m-%d'`"_DLRxqual_MRR_PM"【给FileName赋值】
cd /home/liu_yh2/cha/CopyMRFile【打开文件夹】
mkdir $FileName【创建FileName变量中的文件夹】
cd /home/liu_yh2/cha/CopyMRFile/$FileName【打开新创建的文件夹】
mkdir'FileList'【创建FileList存放Log文件】
elif
[ $Now_Time = 22 ]; then【若当前时间为22时(小时),则提取晚忙常规MRR】
FileName=`date'+%Y-%m-%d'`"_Normal_MRR_PM"【给FileName赋值】
cd /home/liu_yh2/cha/CopyMRFile【打开文件夹】
mkdir $FileName 【创建FileName变量中的文件夹】
cd /home/liu_yh2/cha/CopyMRFile/$FileName【打开新创建的文件夹】
mkdir 'FileList'【创建FileList存放Log文件】
elif
[ $Now_Time = 23 ]; then【若当前时间为23时(小时),则提取晚忙常规NCS】
FileName=`date'+%Y-%m-%d'`"_Normal_NCS_PM"【给FileName赋值】
cd /home/liu_yh2/cha/CopyMRFile【打开文件夹】
mkdir $FileName【创建FileName变量中的文件夹】
cd /home/liu_yh2/cha/CopyMRFile/$FileName【打开新创建的文件夹】
mkdir 'FileList'【创建FileList存放Log文件】
elif
[ $Now_Time = 01 ]; then【若当前时间为01时(小时),则提取晚忙上行质差MRR】
FileName=`date'+%Y-%m-%d'`"_ULRxqual_MRR_PM"【给FileName赋值】
cd /home/liu_yh2/cha/CopyMRFile【打开文件夹】
mkdir $FileName【创建FileName变量中的文件夹】
cd /home/liu_yh2/cha/CopyMRFile/$FileName【打开新创建的文件夹】
mkdir 'FileList'【创建FileList存放Log文件】
fi
#!/bin/csh【调取环境】
/home/liu_yh2/cha/CopyMRFile【打开目录】
perl/home/liu_yh2/cha/CopyMRFile/No2_ftp_files.sh GZM01A
>>/home/liu_yh2/cha/CopyMRFile/$FileName/OutputFileLog_0.log【GZM01A网元调用“关键模块”并将执行结果记录到OutputFileOlg_0.log文件中】
引导模块主要作用在于根据启动时间判断所需提取的数据类型,并创建好存放数据的文件夹用于存放数据,创建相应文件夹后如下图所示:
[attach]312046[/attach]
最后再逐个读取BCS并引起进入关键模块完成数据提取工作;
(二)、 关键模块相关指令设置及指令作用解释:
#!/bin/sh 【调用环境】
BSC_NAME=$1【获取BCS名称】
NOW_DATE=`date'+%Y-%m-%d_%p'`【获取当前日期】
DateLimt_Mon=`date '+%b'`【获取当前月份】
DateLimt_Day=`date '+%d'`【获取当前日期】
DateLimt_Day=`expr
$DateLimt_Day-0`【当前日期-0,用于读取历史数据,-1代表为昨天、-2代表前天】
Now_Time=`date '+%H'`【获取当前时间,作为判断基础】
if [ $Now_Time = 12];then【若当前时间(小时)为12时,则收取常规MRR、NCS文件】
FileName=`date'+%Y-%m-%d'`"_MRR&NCS_AM"【给变量FileName赋值】
LogFileLocal=$FileName"/FileList"【给变量LogFileLocal赋值,Log文件存放地址】
MrrFileLocal=$FileName"/MRR"【给变量MrrFileLocal赋值,MRR文件存放地址】
NcsFileLocal=$FileName"/NCS"【给变量NcsFileLocal赋值,NCS文件存放地址】
TimeLimt_UP="11:00"【给变量TimeLimt_UP赋值,时间门限:上门限】
TimeLimt_DM="13:00"【给变量TimeLimt_DM赋值,时间门限:下门限】
ReadMrr="True"【给变量ReadMrr赋值,是否读取MRR数据】
ReadNcs="True"【给变量ReadNcs赋值,是否读取NCS数据】
elif
[ $Now_Time = 19 ];then【若当前时间(小时)为19时,则收取下行质差MRR】
MrrFileLocal=`date'+%Y-%m-%d'`"_DLRxqual_MRR_PM" 【给变量MrrFileLocal赋值,MRR文件存放地址】
LogFileLocal=$MrrFileLocal"/FileList"【给变量LogFileLocal赋值,Log文件存放地址】
TimeLimt_UP="18:00"【给变量TimeLimt_UP赋值,时间门限:上门限】
TimeLimt_DM="20:00"【给变量TimeLimt_DM赋值,时间门限:下门限】
ReadMrr="True"【给变量ReadMrr赋值,是否读取MRR数据】
ReadNcs="False"【给变量ReadNcs赋值,是否读取NCS数据】
elif
[ $Now_Time = 22 ]; then【若当前时间(小时)为22时,则收取常规MRR、NCS文件】
MrrFileLocal=`date'+%Y-%m-%d'`"_Normal_MRR_PM"【给变量MrrFileLocal赋值,MRR文件存放地址】
LogFileLocal=$MrrFileLocal"/FileList"【给变量LogFileLocal赋值,Log文件存放地址】
TimeLimt_UP="21:00"【给变量TimeLimt_UP赋值,时间门限:上门限】
TimeLimt_DM="22:00"【给变量TimeLimt_DM赋值,时间门限:下门限】
ReadMrr="True"【给变量ReadMrr赋值,是否读取MRR数据】
ReadNcs="False"【给变量ReadNcs赋值,是否读取NCS数据】
elif
[ $Now_Time = 23 ]; then【若当前时间(小时)为23时,则收取常规NCS文件】
NcsFileLocal=`date'+%Y-%m-%d'`"_Normal_NCS_PM"【给变量NcsFileLocal赋值,Ncs文件存放地址】
LogFileLocal=$NcsFileLocal"/FileList"【给变量LogFileLocal赋值,Log文件存放地址】
TimeLimt_UP="23:00"【给变量TimeLimt_UP赋值,时间门限:上门限】
TimeLimt_DM="23:59"【给变量TimeLimt_DM赋值,时间门限:下门限】
ReadMrr="False"【给变量ReadMrr赋值,是否读取MRR数据】
ReadNcs="True"【给变量ReadNcs赋值,是否读取NCS数据】
elif
[ $Now_Time = 01 ]; then【若当前时间(小时)为01时,则收取上行质差MRR文件】
MrrFileLocal=`date'+%Y-%m-%d'`"_ULRxqual_MRR_PM" 【给变量NcsFileLocal赋值,Ncs文件存放地址】
LogFileLocal=$MrrFileLocal"/FileList"【给变量LogFileLocal赋值,Log文件存放地址】
TimeLimt_UP="00:00"【给变量TimeLimt_UP赋值,时间门限:上门限】
TimeLimt_DM="02:00"【给变量TimeLimt_DM赋值,时间门限:下门限】
ReadMrr="True"【给变量ReadMrr赋值,是否读取MRR数据】
ReadNcs="False"【给变量ReadNcs赋值,是否读取NCS数据】
Fi
/home/liu_yh2/cha/CopyMRFile/No3_dir_files.sh$BSC_NAME >/home/liu_yh2/cha/CopyMRFile/$LogFileLocal/$BSC_NAME"_MR_Filelist.log"【读取BSC引导进入“访问模块”,并将相关数据存放到LOG文件夹下】
FILENAME=`tail-6000/home/liu_yh2/cha/CopyMRFile/$LogFileLocal/$BSC_NAME"_MR_Filelist.log"|awk'{if($6=="'$DateLimt_Mon'" && $7=="'$DateLimt_Day'"&& ($8>"'$TimeLimt_UP'" &&$8<"'$TimeLimt_DM'") ) print $9}'`【关键语句,解释见下文】
echo"--------------------"$BSC_NAME"---------------------"【输出文本信息】
for CopeFile in $FILENAME【循环读取获取到符合条件的文件列表】
do
MrrCheck=`echo $CopeFile|grep -c MRR`【筛选出MRR数据,用于识别数据类型】
Ncs00Check=`echo $CopeFile|grep -cBARFIL00`【筛选出BAR00数据,用于识别数据类型】
Ncs01Check=`echo $CopeFile|grep -cBARFIL01`【筛选出BAR01数据,用于识别数据类型】
Fas00Check=`echo $CopeFile|grep -cRIRFIL00`【筛选出RIR00数据,用于识别数据类型】
Fas01Check=`echo $CopeFile|grep -cRIRFIL01`【筛选出RIR01数据,用于识别数据类型】
if [ $MrrCheck = 1 -a$ReadMrr="True" ];then【如果识别到MRR文件同时ReadMrr=TRUE,则运行】
cd /home/qiu_ln/RNODATA/$BSC_NAME/MRRTRQ【打开存放MRR数据的文件夹】
cp $CopeFile /home/liu_yh2/cha/CopyMRFile/$MrrFileLocal/$BSC_NAME"_"$CopeFile【将目标文件复制到新的目录下,并重命名】
echo "OutputFile:"$CopeBARFIL00File"__[MRR_File]"【输出LOG信息】
elif
[ $Ncs00Check = 1 -a $ReadNcs="True"];then【如果识别到BAR00文件同时ReadNcs=TRUE,则运行】
cd/home/qiu_ln/RNODATA/$BSC_NAME/BARTRQ【打开BAR存放地址】
cp $CopeFile /home/liu_yh2/cha/CopyMRFile/$NcsFileLocal/$BSC_NAME"_00_"$CopeFile
echo "OutputFile:"$CopeFile"__[BAR_00_File]"【输出LOG信息】
elif
[ $Ncs01Check = 1 -a$ReadNcs="True" ];then【如果识别到BAR00文件同时ReadNcs=TRUE,则运行】
cd/home/qiu_ln/RNODATA/$BSC_NAME/BARTRQ【打开BAR存放地址】
cp $CopeFile /home/liu_yh2/cha/CopyMRFile/$NcsFileLocal/$BSC_NAME"_01_"$CopeFile【输出文件】
echo "OutputFile:"$CopeFile"__[BAR_01_File]"【输出LOG信息】
elif
[ $Fas00Check = 1 -a$ReadFas="True" ];then【如果识别到BAR00文件同时ReadNcs=TRUE,则运行】
cd/home/qiu_ln/RNODATA/$BSC_NAME/RIRTRQ【打开RIR存放地址】
cp$CopeFile /home/liu_yh2/cha/CopyMRFile/$FasFileLocal/$BSC_NAME"_00_"$CopeFile【输出文件】
echo "Output File:"$CopeFile"__[RIR_00_File]"【输出LOG信息】
elif
[ $Fas01Check = 1 -a $ReadFas="True"];then【如果识别到BAR00文件同时ReadNcs=TRUE,则运行】
cd/home/qiu_ln/RNODATA/$BSC_NAME/RIRTRQ【打开RIR存放地址】
cp$CopeFile/home/liu_yh2/cha/CopyMRFile/$FasFileLocal/$BSC_NAME"_01_"$CopeFile【输出文件】
echo "OutputFile:"$CopeFile"__[RIR_01_File]"【输出LOG信息】
fi done
echo"----------------------Done----------------------"【输出LOG信息】
关键模块的应用流程如下:
通过启动时间来判断数据类型;
设置相应的提取时间门限;
启动访问模块获取文件列表;
通过门限筛选出符合条件的文件列表;
二次过滤文件类型是NCS、MRR或是FAS数据;
提取文件到指定目录;
(三)、 访问模块相关指令设置及指令作用解释:
#!/bin/sh 【调用环境】
BSC_NAME=$1【获取BSC网元名称】
cd /home/qiu_ln/RNODATA/$BSC_NAME/MRRTRQ【打开存放MRR数据地址,不同BSC的地址】
ls -l 【获取文件列表】
cd /home/qiu_ln/RNODATA/$BSC_NAME/BARTRQ【打开存放MRR数据地址】
ls -l 【获取文件列表】
cd /home/qiu_ln/RNODATA/$BSC_NAME/RIRTRQ【打开存放MRR数据地址】
ls -l 【获取文件列表】
访问模块的主要作用是访问远程存放测量数据目录,并获取目录下的所有文件列表并保存为LOG文件;
(四)、 关键模块【AWK语句】指令详解:
FILENAME=`tail -6000 /home/liu_yh2/cha/CopyMRFile/$LogFileLocal/$BSC_NAME"_MR_Filelist.log"|awk '{if($6=="'$DateLimt_Mon'" &&$7=="'$DateLimt_Day'" && ($8>"'$TimeLimt_UP'"&& $8<"'$TimeLimt_DM'") ) print $9}'`
蓝色脚本:读取从远程获取到的文件列表;
红色脚本:筛选符合条件的文件;
访问模块从远程获取的文件列表格式如下图所示:
数据共分9列,其中第6-9列分别是文件的月份、日期、时间和文件名称,它们的代表公式分别为:$6、$7、$8和$9;
[attach]312047[/attach]
通过月份、日期和时间可以准确的筛选出我们所需要的数据,如需要取1月29日,早忙10点至11点的数据,脚本的相应设置如下:
|awk '{if($6=="'Jan" &&$7=="'27'" && ($8>"'10:00'" && $8<"'12:00") ) print $9}'`
运行结果则显示为:MRRFIL00-0000001666,
BARFIL01-0000000749;
这时我们可以循环通过以下语句读取以上结果,进行MRR、NCS、FAS文件的过滤识别操作:
MrrCheck=`echo $CopeFile|grep -c MRR`
若$CopeFile变量中包含“MRR”即MRRCheck为1
Ncs00Check=`echo $CopeFile|grep -c BARFIL00`
若$CopeFile变量中包含“BARFil00”即Ncs00Check为1
Ncs01Check=`echo $CopeFile|grep -c BARFIL01`
若$CopeFile变量中包含“BARFil01”即Ncs01Check为1
Fas00Check=`echo $CopeFile|grep -c RIRFIL00`
若$CopeFile变量中包含“RIRFil01”即Fas01Check为1
Fas01Check=`echo $CopeFile|grep -c RIRFIL01`
若$CopeFile变量中包含“RIRFil01”即Fas01Check为1
通过以上层层的筛选和过滤,我们的目标数据便可以准确的输出,Unix Raid最大的特点在于绕过爱立信OSS系统,直接访问BSC硬盘(或远端目录)获取文件列表,并通过列表提供的时间、日期、月份及文件名称等信息进行定位和提取,成功解决OSS数据转存慢的问题。
以下是详细说明及脚本文件:
以下内容跟帖回复才能看到==============================
Unix Raid数据提取脚本工作原理说明.rar (328.94 KB)==============================
[
本帖最后由 Xcvip06 于 2014-6-15 23:42 编辑 ]