如何无需读写文件实现该Bash脚本的DistCp任务信息采集入库?
问题描述
我编写了一段Bash脚本,内容如下:
#!/usr/bin/env bash time_event="`date +%Y-%m-%d' '%H:%M:%S`" current_day="`date +%Y%m%d`" event="start_job" src='hdfs://table1/' dst='hdfs://table2/' hadoop distcp -bandwidth 256 -m 50 -delete -update -strategy dynamic $src $dst &> log.txt status=($?) link=$(grep -oP "The url to track the job: \K[^']+" log.txt) job=$(grep -oP "Submitting tokens for job: \K[^']+" log.txt) hive -e "insert into table <table> partition (day) select '$src' as source_path, '$dst' as target_path, '$time_event' as time_event, '$event' as event, '$status' as status, '$link' as url_job, '$job' as url_pipeline, $current_day as day;"
当前脚本通过写入并读取log.txt文件获取DistCp任务相关信息后写入Hive表,请问如何修改脚本,无需读写文件即可实现相同功能?
修改后的脚本
#!/usr/bin/env bash time_event="$(date +%Y-%m-%d' '%H:%M:%S)" current_day="$(date +%Y%m%d)" event="start_job" src='hdfs://table1/' dst='hdfs://table2/' # 直接捕获distcp的所有输出到变量,同时保留退出状态 distcp_output=$(hadoop distcp -bandwidth 256 -m 50 -delete -update -strategy dynamic "$src" "$dst" 2>&1) status=$? # 从内存变量中提取所需信息,无需读写文件 link=$(grep -oP "The url to track the job: \K[^']+" <<< "$distcp_output") job=$(grep -oP "Submitting tokens for job: \K[^']+" <<< "$distcp_output") hive -e "insert into table <table> partition (day) select '$src' as source_path, '$dst' as target_path, '$time_event' as time_event, '$event' as event, '$status' as status, '$link' as url_job, '$job' as url_pipeline, $current_day as day;"
关键改动说明
- 用
distcp_output=$(hadoop distcp ... 2>&1)直接把distcp的标准输出和错误输出捕获到内存变量中,替代写入文件的操作; - 通过
<<< "$distcp_output"将变量内容作为grep的输入,直接从内存提取信息,无需读取磁盘文件; - 把原脚本的反引号命令替换写法
`改为$(),这是Bash更推荐的写法,可读性更强且避免嵌套解析问题; - 给
$src和$dst添加双引号,避免路径含特殊字符时出现解析错误; - 修正
status=($?)为status=$?,原写法会将单个退出状态值拆分为数组,这里直接获取数值即可。
内容的提问来源于stack exchange,提问作者yurkaishere
相关产品推荐
相关产品推荐

