免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3590 | 回复: 10

[文本处理] 如何抽取文本中同一天的日期的某一行数据 [复制链接]

论坛徽章:
0
发表于 2018-03-22 16:56 |显示全部楼层
求助高手指点,下面的程序如何修改:
功能:在duty_list.txt文件是运维人员每天的白班、夜班排班信息,希望通过每天两次定时执行脚yunwei_update.sh抽取数据,每天0:01执行脚本,抽取duty_list.txt当天日期“夜班”的一行数据;每天8:30执行脚本抽取duty_list.txt当天日期“白班”的一行数据,分别对运维人员姓名DutyEngineer和手机号DutyEngineer_Phone进行更新。
目前的脚本实现了按系统日期抽取数据更新字段信息,请教如何实现从duty_list.txt文本抽取夜班、白班字段的数据?
(1) #more duty_list.txt
##部门名称,人员姓名,日期,时间段,手机号,班次
网络部        张三,李四,王五        2018-03-21        0:00~8:29        18711111111,18711111112,18711111113        夜班
网络部        张三,李四,赵六        2018-03-21        8:30~23:59        18711111111,18711111112,18711111114        白班
网络部        张三,李四,王五        2018-03-22        0:00~8:29        18711111111,18711111112,18711111113        夜班
网络部        李四,赵六,刘磊        2018-03-22        8:30~23:59        18711111112,18711111114,18711111115        白班
网络部        张三,李四,吴雨        2018-03-23        0:00~8:29        18711111111,18711111112,18711111123        夜班
网络部        黄明,李四,赵六,刘磊        2018-03-23        8:30~23:59        18711111119,18711111112,18711111113,18711111115        白班
(2)#more yunwei_update.sh
#!/bin/sh
###############################
source /home/netcool/.profile
currentdate=`date +%Y-%m-%d`
#从duty_list.txt的表中取出部门名称,值班人员名称,值班手机号
firstorgname=$(awk -v time=`date +%F` '$3~time{print $1}'  /backup/yunwei/duty_list.txt)
echo $firstorgname
dutyname=$(awk -v time=`date +%F` '$3~time{print $2}'  /backup/yunwei/duty_list.txt)
echo $dutyname
dutymobile=$(awk -v time=`date +%F` '$3~time{print $5}'  /backup/yunwei/duty_list.txt)
echo $dutymobile
#定时执行脚本每天0:01 抽取duty_list.txt当天日期夜班的一行数据;每天8:30抽取duty_list.txt当天日期白班的一行数据,分别对运维人员姓名DutyEngineer和手机号DutyEngineer_Phone进行更新
/opt/IBM/tivoli/netcool/omnibus/bin/nco_sql -server TESTOS -username oper -password xxxxxxx <<EOF >>/tmp/DutyList.log
update alerts.status set DutyEngineer_Phone='$dutymobile',DutyEngineer='$dutyname' where FirstOrgName like 'Beijing' and Severity>=4 and to_char(getdate,'yyyy-MM-dd') like '$currentdate' and DutyEngineer not like '$dutyname';
go
quit
EOF

下面是duty_list.txt值班人员的排班信息(用TAB隔开):
举例:
系统日期是2018-03-22,crontab定时脚本
在0:01抽取文件中“夜班”这一行的数据:
网络部        张三,李四,王五        2018-03-22        0:00~8:29        18711111111,18711111112,18711111113        夜班
在8:30抽取文件中“白班”这一行的数据:
网络部        李四,赵六,刘磊        2018-03-22        8:30~23:59        18711111112,18711111114,18711111115        白班


论坛徽章:
0
发表于 2018-03-22 20:23 |显示全部楼层
脚本

#白天值班信息输出
#!/bin/bash

#get date
a=$(date +%F)

#get today‘s  all information   . enter to file tmp1
cat /root/shell/101.txt | awk '{if($3~/'$a'/) print $0}'   > /root/shell/tmp1

#cat /root/shell/tmp1


#get 白天信息,enter to file  "baitian"
echo "白天值班人员信息:" > /root/shell/baitian
cat /root/shell/tmp1 | awk 'NR==2 {print $0}' >> /root/shell/baitian

论坛徽章:
0
发表于 2018-03-22 20:26 |显示全部楼层
晚上

#!/bin/bash

#get date
a=$(date +%F)

#get today‘s  information  
cat /root/shell/101.txt | awk '{if($3~/'$a'/) print $0}'   > /root/shell/tmp2


#cat /root/shell/tmp2


#get  晚上,enter to file  "wanshang"
echo "晚上值班人员信息:"  > /root/shell/wanshang
cat /root/shell/tmp2 | awk 'NR==1 {print $0}'  >> /root/shell/wanshang

论坛徽章:
0
发表于 2018-03-22 20:26 |显示全部楼层
#crtont 我这里为了测试,每分钟,你应该写你具体的执行时间
[root@localhost shell]# cat /etc/crontab
#每分钟执行“白天”
*/1 * * * * root sh /root/shell/daytime.sh
#每分钟执行“晚上”
*/1 * * * * root sh /root/shell/night.sh
[root@localhost shell]#

==============
#显示白天值班信息
cat baitian

#显示晚上值班信息
cat wanshang

论坛徽章:
0
发表于 2018-03-22 20:27 |显示全部楼层
怎么也贴不上去 只能输入晚上

论坛徽章:
0
发表于 2018-03-23 00:55 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
发表于 2018-03-23 12:24 |显示全部楼层
回复 1# david0


在脚本中加入下面代码:
  1. mytime=`date +%R`
  2. if [[ "${mytime}" == "00:01" ]];then
  3.     #抽取当天夜班信息
  4.     data_night=$(awk -v time=`date +%F` '$3~time&&$NF=="夜班"' /backup/yunwei/duty_list.txt)
  5.     echo $data_night
  6. elif [[ "${mytime}" == "08:30" ]];then
  7.     #抽取当天白班信息
  8.     data_day=$(awk -v time=`date +%F` '$3~time&&$NF=="白班"' /backup/yunwei/duty_list.txt)
  9.     echo $data_day
  10. fi
复制代码

在crontab中添加下面内容,让脚本每分钟执行1次:
* * * * * yunwei_update.sh

论坛徽章:
0
发表于 2018-03-23 14:19 |显示全部楼层
本帖最后由 david0 于 2018-03-23 14:39 编辑

回复 7# wh7211
非常感谢你的回复,
# ./yunwei_update.sh
网络部 网络部
张三,李四,吴雨 黄明,李四,赵六,刘磊
18711111111,18711111112,18711111123 18711111119,18711111112,18711111113,18711111115

执行脚本后,会把白班、夜班全部抽取出来,有点问题。
其实想实现的功能是0:01执行脚本抽取当天“夜班”的这一行数据;在8:30执行脚本抽取当天“白班”的这一行数据,这些手机号是用于接收从平台发送的短信。只需要在这两个时间点分别抽取就行,不需要每分钟都执行脚本。

论坛徽章:
0
发表于 2018-03-23 14:45 |显示全部楼层
回复 7# wh7211

我把脚本拆分成两个:yunwei_update_night.sh和yunwei_update_daytime.sh其中yunwei_update_daytime.sh脚本在8:30执行
more yunwei_update_daytime.sh
#!/bin/sh
###############################

source /home/netcool/.profile
currentdate=`date +%Y-%m-%d`
#从duty_list.txt的表中取出部门名称,值班人员名称,值班手机号
firstorgname=$(awk -v time=`date +%F` '$3~time&&$NF=="白班"{print $1}'  /backup/shell/duty_list.txt)
echo $firstorgname
dutyname=$(awk -v time=`date +%F` '$3~time&&$NF=="白班"{print $2}'  /backup/shell/duty_list.txt)
echo $dutyname
dutymobile=$(awk -v time=`date +%F` '$3~time&&$NF=="白班"{print $5}'  /backup/shell/duty_list.txt)
echo $dutymobile


#定时执行脚本每天0:01 抽取duty_list.txt当天日期夜班的一行数据;每天8:30抽取duty_list.txt当天日期白班的一行数据,分别对运维人员姓名DutyEngineer和手机号DutyEngineer_Phone进行更新
/opt/IBM/tivoli/netcool/omnibus/bin/nco_sql -server TESTOS -username oper -password xxxxxxx <<EOF >>/tmp/DutyList.log
update alerts.status set DutyEngineer_Phone='$dutymobile',DutyEngineer='$dutyname' where FirstOrgName like 'Beijing' and Severity>=4 and to_char(getdate,'yyyy-MM-dd') like '$currentdate' and DutyEngineer not like '$dutyname';
go
quit
EOF


但在执行yunwei_update_daytime.sh脚本时,
# ./yunwei_update_daytime.sh
网络部 网络部
张三,李四,吴雨 黄明,李四,赵六,刘磊
18711111111,18711111112,18711111123 18711111119,18711111112,18711111113,18711111115

返回的数据不正确,请教wh7211
$(awk -v time=`date +%F` '$3~time&&$NF=="白班"{print $5}'  /backup/shell/duty_list.txt)  这种写法有问题?

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
发表于 2018-03-23 15:14 |显示全部楼层
本帖最后由 wh7211 于 2018-03-23 15:22 编辑

回复 9# david0

代码我在linux下测试是没有问题的。从输出结果看,是『$NF=="白班"』这个模式匹配失败,你可以从下面几方面排错:
1、确认『duty_list.txt』文件格式。可以使用命令『dos2unix duty_list.txt』直接把文件转成unix格式。
2、确认『duty_list.txt』文件编码。你可以用notepad++打开此文件查看文件编码,比如是ANSI或是UTF-8。
3、确认登录linux使用的『终端』编码。终端编码要和文件编码一致。
4、如果通过上面操作还是有问题,你可以在linux系统中删除原来的『duty_list.txt』,然后重新vi一个新的『duty_list.txt』并把文件内容复制进去,再次执行脚本测试。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP