Python与shell命令互传

参考网址:http://www.jb51.net/article/43500.htm

#!/usr/bin/python
# -*- coding:utf-8 -*-


"""
time:2017年5月23日17:01:38
author:zmy
intention:根据某个集市直接获取需要迁移的清单
"""

import os
import time

sum_line = 0

if __name__ == '__main__':

    #获取该mart_cmo下所有的列表:排除"partitions|.Trash|data_export.db|.sparkStaging|.staging"这几个清单
    fr2 = os.popen('hdfs dfs -du -s hdfs://172.19.167.12:8020/user/mart_cmo/* |sort -n -k1 |egrep  -v "partitions|.Trash|data_export.db|.sparkStaging|.staging"')
    #此时的整个表清单上是个字符串
    content = fr2.read()
    content_list = content.split("\n")

    #该目录用与存放最终的目录
    final_result = []

    #第一轮处理
    middle_result1 = []
    for line in content_list:
        if line:
            big_location = line.split()
            #获取当前行的目录大小和位置信息
            content_size = int(big_location[0])
            content_location = str(big_location[1])
            #5T的大小 = 5497558138880
            if content_size < 5497558138880:
                sum_line += 1
                final_result.append(big_location[1])
            else:
                middle_result1.append(big_location[1]+"/*")

    #第二轮处理
    #注意:此时line的形式为 大小 + 位置
    middle_result2 = []
    for line in middle_result1:
        if line:
            location = line.strip()
            os.environ['location'] = str(location)
            fr2 = os.popen('hdfs dfs -du -s $location |sort -n -k1')
            content_data = fr2.read()
            #进行二次判断
            content2_list = content_data.split("\n")
            for line in content2_list:
                if line:
                    big_location = line.split()
                    #获取当前行的目录大小和位置信息
                    content_size = int(big_location[0])
                    content_location = str(big_location[1])
                    # 5T的大小 = 5497558138880
                    if content_size < 5497558138880:
                        sum_line += 1
                        final_result.append(big_location[1])
                    else:
                        #下面一行代码包含大小和位置
                        middle_result2.append(big_location[1]+"/*")

    #第三轮处理
    #middle_result2当中存放的是目录,注意:没有对应的大小
    middle_result3 = []
    for line in middle_result2:
        if line:
            location = line.strip()
            os.environ['location'] = str(location)
            fr3 = os.popen('hdfs dfs -du -s $location |sort -n -k1')
            content_data = fr3.read()
            #进行三次判断
            content3_list = content_data.split("\n")
            for line in content3_list:
                if line:
                    big_location = line.split()
                    #获取当前行的目录大小和位置信息
                    content_size = int(big_location[0])
                    content_location = str(big_location[1])
                    # 5T的大小 = 5497558138880
                    if content_size < 5497558138880:
                        sum_line += 1
                        final_result.append(big_location[1])
                    else:
                        #下面一行代码包含大小和位置
                        middle_result3.append(big_location[1]+"/*")

    #第四轮处理
    #呵呵,经过第四轮处理后不知道会不会消失
    middle_result4 = []
    for line in middle_result3:
        if  line:
            location = line.strip()
            os.environ['location'] = str(location)
            fr4 = os.popen('hdfs dfs -du -s $location |sort -n -k1')
            content_data = fr4.read()
            #进行四次判断
            content4_list = content_data.split("\n")
            for line in content4_list:
                if line:
                    big_location = line.split()
                    #获取当前行的目录大小和位置信息
                    content_size = int(big_location[0])
                    content_location = str(big_location[1])
                    # 5T的大小 = 5497558138880
                    if content_size < 5497558138880:
                        sum_line += 1
                        final_result.append(big_location[1])
                    else:
                        #下面一行代码包含大小和位置
                        middle_result4.append(big_location)


    #4轮过后我们在检查一次
    print("sum=%d"%sum_line)
    print("4轮过后仍没有被细化的列表:")
    for line in middle_result4:
        print("\033[45;1m%s\033[0m" % line)
    line = "Successful!"
    print("\033[45;1m%s\033[0m"%(line))

    #将最终的结果输出到指定的文件list当中
    print("正在将最终的结果刷到list中")
    fr5 = open("./list",mode="w",encoding="utf-8")
    for line in final_result:
        if line:
            fr5.write(line+"\n")

    fr5.close()

    # 从结果集list中过滤出不含有dt=信息的文本,并赋值给list1
    print("正在从结果集当中过滤出含有dt分区的字段!")
    os.system('more list | grep -v "dt="  > list1')
    time.sleep(5)

    # 从结果集list中过滤出含有dt=信息的文本,并赋值给list2
    print("正在从结果集当中过滤出不含有dt分区的字段!")
    os.system('more list | grep  "dt="  > list2')
    time.sleep(5)

    #对于list1,调用脚本list.sh进行处理,形成第一个结果集distcp.list
    print("根据list列表中的清单构造10K对应的清单列表")
    os.system('sh ./list.sh')
    time.sleep(30)

    #对于list2,进行文本格式的处理,只过滤出路径即可。
    fr6 = os.popen('more list2 |awk -F "/dt="  \'{print $1}\'')
    content6 = fr6.read()
    content_list6 = content6.split("\n")

    # 定义一个set列表,用来去重
    set_list = []
    for line in content_list6:
        if line and line not in set_list:
            set_list.append(line)

    print("你好,需要手动处理的清单为:\033[42;1m%d\033[0m个" % (len(set_list)))
    print("将需要手动处理的清单存储到了distcp_handle.list文本中")
    fr7 = open("./distcp_handle.list", mode="w", encoding="utf-8")
    for line in set_list:
        if line:
            fr7.write(line + "\n")

    """
    当前目录下各个文件的作用:
    1.transfer_help.py  总脚本
    2.list  所有需要迁移的清单
    3.list1 不含有日期的清单
    4.list2 含有日期的清单
    5.distcp.list  list1通过list.sh处理的结果,是第一批需要拷贝的清单结果
    6.distcp_handle.list  需要手动进一步处理的清单
    7. 本脚本执行方法:/usr/local/bin/python3.2  transfer_help.py
    8.在cmo1或者cmo2客户端执行hdfs dfs -rmr hdfs://ns14/user/mart_cmo/temp/*/.distcp.tmp.attempt* 可以删除*/目录下distcp的冬冬
    """
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只懒得睁眼的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值