`

go语言四——脚本一

 
阅读更多

工作中用go语言写了点脚本代替python的功能,涉及文件读写,记录如下

package main

import (
        "os"
        "os/exec"
        "log"
        "bytes"
        "strings"
        "bufio" //文件读写
        "strconv"
//      "fmt"
)

const pwd = "/usr/local/nginx/htdocs/"

func get_logname(ziplog_name string) (string) {

        var out bytes.Buffer
 
        //hint:用exec.Command获取一个Cmd对象,设置标准输出到out,执行Run操作
        cmd := exec.Command("unzip","-o",ziplog_name,"-d",ziplog_name[0:len(ziplog_name)-4])
        cmd.Stdout = &out
        err := cmd.Run()
        if err != nil {
                log.Fatal(err)
        }
        //hint:标准输出可通过out.String()获取,用strings.Index获取指定字符串所在位置
        i:=strings.Index(out.String(),"inflating: ")
        log_name:=out.String()[i+len("inflating: "):]
        //hint:通过strings.Trim删除字符串两侧的换行符以及空格
        log_name = strings.Trim(log_name,"\n ")

        return log_name
}

func getinfo(line string)(string,string,string) {
        appname, day, curhour := "", "", ""

        //用strings的库函数拆分字符串,可以用&&添加多个判断
        if info := strings.Split(line, " "); len(info) > 5 && info[3] == "OK" {
                appname = info[4]
        }
        if tday := strings.Split(line, "["); len(tday) > 1 {
                tday = strings.Split(tday[1]," ")

                day = ...
        }

        if hour := strings.Split(line, ":"); len(hour) > 1 {
                //hint 用strconv库函数判断字符串是否为数字
                _, err := strconv.Atoi(hour[1])
                if err != nil {
                        return "","",""
                }
                curhour = hour[1]

        }
        return appname, day, curhour
}

func saveline(filepath, filename, line string) {

        //打开文件,如果失败,创建文件夹先,打开方式为append,和读写
        f, err := os.OpenFile(filename, os.O_APPEND|os.O_RDWR, 0666)
        if err != nil {
                //如果文件夹已经创建,返回nil,MkdirAll是递归创建子目录
                err = os.MkdirAll(filepath, 0755)
                if err != nil {
                        log.Fatal(err)
                }
                f, err = os.OpenFile(filename, os.O_APPEND|os.O_RDWR, 0666)
                if err != nil {
                        //如果文件不存在,则用Create创建,默认打开类型为读写
                        f, err = os.Create(filename)
                        if err != nil {
                                log.Fatal(err)
                        }
                }
        }

        //设置defer关闭文件
        defer f.Close()

        //hint:用bufio逐行写入文件
        line = line + "\n"
        b := bufio.NewWriter(f)
        if n, err := b.WriteString(line); err != nil || n != len(line) {
                log.Fatal(err)
        }
        //hint:调用Flush将内存写到磁盘
        if err = b.Flush(); err != nil {
                log.Fatal(err)
        }
}

func worker(line, p1, p2 string) {
        app, day, hour := getinfo(line)

        var filepath, filename string

        if day == "" || hour == "" {
                return
        }

        if app != "" {
                filepath = pwd + "workdir/app/" +  app + "/" + day + "/"
                filename = filepath + hour + ".log"
                saveline(filepath, filename, line)
        }

        filepath = pwd + "workdir/backup/" + day + "/" + log_from + "/"
        filename = filepath + hour + ".log"
        saveline(filepath, filename, line)
}

func main() {

        //hint :os.Args获取命令行参数,用len获取参数个数
        if len(os.Args) < 3 {
                log.Panic("fatal error")
        }
        para1, para2 := os.Args[1], os.Args[2]

        //hint :调用os的函数Chdir实现目录切换
        if err := os.Chdir(pwd + "workdir/"); err != nil {
                log.Panic("fatal error")
        }

        //hint :设置defer,函数退出时调用os.RemoveAll,递归删除子目录以及文件
        defer os.RemoveAll("dir")
        defer f.Close()

        //hint :用os.Open打开文件以及bufio逐行读取
        f, err := os.Open("file.exist")
        if err != nil {
                log.Fatal(err)
        }

        r := bufio.NewReader(f)
        line, _, err := r.ReadLine()
        for err == nil {
                worker(string(line),para1,para2)
                line, _, err = r.ReadLine()
        }
}

日志记录到文件的方法如下:

 

package main

import "io"
import "log"
import "os"

const logFileName = "test.log"

func main() {
        logf, err := os.OpenFile(logFileName, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0640)
        if err != nil {
                log.Fatalln(err)
        }
        log.SetOutput(logf)
        mylogger := log.New(io.MultiWriter(logf,os.Stdout),"",-1)
        log.Println("goes to logf")
        mylogger.Println("goes to stdout and logf")
}

日志文本如下

2013/06/04 07:59:06 goes to logf
2013/06/04 07:59:06.526852 test.go:17: goes to stdout and logf

不知道如何做性能对比,不过从运行结果来看,cpu占用比python低非常多

分享到:
评论

相关推荐

    基于Go语言与Shell脚本融合的He3DB高性能数据库代理设计源码

    该项目是中移(苏州)软件技术有限公司研发的He3DB高性能数据库代理项目——He3Proxy,源码以Go语言为主,融合Shell脚本,共计111个文件,其中包含77个Go源文件、9个Markdown文档、4个YAML配置文件、4个PNG图像文件...

    【毕业设计】基于go语言实现的排课抢课系统【后端源码+SQL脚本】.zip

    本文将深入探讨一个由字节跳动后端技术训练营提供的毕业设计项目——“基于Go语言实现的排课抢课系统”。这个系统不仅包含了完整的后端源码,还提供了SQL脚本,为开发者提供了一个实战学习和研究的平台。 Go语言,...

    Ourea Go Framework(csdn)————程序.pdf

    **Ourea Go Framework** 是一个轻量级但功能逐渐完善的Go语言开发框架,由开发者Houhuiyang创建。该框架旨在简化Go应用程序的构建,支持依赖注入,并且采用了领域驱动设计(DDD)的简化版本。框架源代码遵循Apache ...

    基于Go语言的西电社团报名uapply-micro微服务设计源码

    该项目是利用Go语言开发的西电社团报名微服务——uapply-micro的设计源码,总计包含214个文件,涵盖177个Go源文件、9个SQL脚本、5个YAML配置文件、4个API定义文件、4个Protocol Buffers描述文件、2个XML文件、1个Git...

    Go-golua-Go绑定LuaCAPI

    6. **并发支持**:Go语言的一大特色是其并发模型——goroutine和channel。golua项目考虑到了这一点,使得在Go程序中并行执行Lua脚本成为可能,提高了程序的性能。 7. **安全性**:golua通过一些手段限制了Lua脚本对...

    用英文写一篇短文介绍计算机语言的发展历史和特点,要求简单介绍机器语言、汇编语言、高级语言的简单发展历程和各自的特点。

    例如,JavaScript作为一种脚本语言,不仅应用于网页,还可以在服务器端运行,实现了前后端的统一。而像Go、Rust这样的新语言,则是为了应对多核处理器时代而设计,优化了并发和内存管理。 总的来说,计算机语言从...

    Go-数据库迁移的CLI和Golang库

    Go语言以其高效、简洁的特性在开发领域受到广泛应用,因此,针对Go开发的数据库迁移工具和库就显得尤为重要。本篇文章将详细介绍名为"Golang-Migrate"的CLI(命令行接口)工具和相应的Golang库,它们是Go开发者进行...

    开源项目-mattn-anko.zip

    《开源项目:mattn-anko——Go语言的脚本解释器》 在IT领域,开源项目扮演着至关重要的角色,它们推动技术创新,鼓励社区协作,并为开发者提供了丰富的学习资源。今天我们将聚焦一个名为"mattn-anko"的开源项目,这...

    一个 Go 语言实现的 Java 版本管理器,支持 Oracle JDK 和 OpenJDK .zip

    本文将深入探讨一个用Go语言编写的Java版本管理器——Jabba,它支持Oracle JDK和OpenJDK,且具备跨平台特性。 ### 1. Go语言介绍 Go(又称Golang)是由Google开发的一种静态类型、编译型、并发型且具有垃圾回收功能...

    go1.9.3.linux-amd64.tar.gz官网最新版

    Go语言,也被称为Golang,是由Google开发的一种静态类型的、编译式的、并发型且具有垃圾回收功能的编程语言。Go语言的设计理念是简洁、高效和可移植,它结合了C语言的执行效率和Python、Ruby等脚本语言的开发速度。...

    vim-go-ide:Vim作为go语言的IDE将vim打造成go语言的ide

    本文将深入探讨如何将经典的文本编辑器Vim转换为针对Go语言的强大IDE——vim-go-ide。Vim以其高度可定制性和高效的操作方式受到许多程序员的喜爱,而通过安装和配置特定的插件,我们可以将其转变为一个功能完备的Go...

    基于Go语言的企业级监控解决方案Nightingale设计源码

    该项目是采用Go语言开发的企业级监控解决方案——夜莺(Nightingale)的设计源码,总计包含145个文件,涵盖Go、Shell、Python和HTML等多种编程语言。源码结构包括123个Go源文件、4个Markdown文件、3个YAML文件、2个...

    购物中心招商宣传片脚本.pptx

    【博奥时代购物中心招商宣传片脚本】是一份用于展示购物中心品牌形象和吸引商家入驻的重要文档,其主要内容涵盖了购物中心的定位、城市背景、企业实力以及项目特色等多个方面。此宣传片旨在通过大气、时尚和动感的...

    golang下微服务框架示例

    "golang下微服务框架示例"这个项目是利用Go语言的一个热门微服务框架——go-micro,结合另一个轻量级Web框架iris,来创建一个完整的微服务体系。以下是对该项目的详细解析: 1. **go-micro**: go-micro是一个针对Go...

    开源项目-flowerinthenight-golang-monorepo.zip

    《深入剖析Go语言单体仓库(Monorepo)实践——以flowerinthenight项目为例》 在软件开发领域,开源项目扮演着至关重要的角色,它们推动了技术创新,提供了丰富的学习资源,同时也为开发者们提供了协作的平台。...

    开源项目-golang-go.zip

    【开源项目-golang-go.zip】是一个与Go编程语言相关的开源项目压缩包,其中包含了Go语言的一个主分支——go-master。这个项目可能是一个针对Go语言的扩展、工具、库或者框架,旨在为开发者提供更多的功能和支持。Go...

    3D-go-whiskey.zip

    Go语言,又称为Golang,是Google推出的一种静态类型的、编译型的、并发型的、垃圾回收的编程语言。Go语言以其简洁的语法、高效的性能和强大的并发支持而受到开发者喜爱。在3D游戏开发领域,Go语言的这些特性使得它...

    Go-lesspass-gui是lesspass.go包的一个GUI工具

    在标签“Go开发-其它杂项”中,我们可以推断`Go-lesspass-gui`是一个使用Go语言进行开发的非标准或非典型的项目,可能是由于它的特殊性质——作为LessPass的GUI工具,而非纯粹的Go语言库或者传统的命令行工具。...

    Go-warp让您通过一个简单的命令安全地共享您的终端

    标题 "Go-warp让您通过一个简单的命令安全地共享您的终端" 涉及到的是一个基于Go语言开发的工具——Warp,它提供了一种便捷且安全的方式,让用户能够通过命令行分享自己的终端会话。这个工具对于远程协作、演示或者...

    go-1.9.2-linux-windows-mac安装包

    Go语言,通常被称为Golang,是由Google开发的一种静态类型的、编译式的、并发型且具有垃圾回收功能的编程语言。Go语言的设计理念是简洁、高效和可移植,它结合了C语言的执行效率和Python、Ruby等脚本语言的开发速度...

Global site tag (gtag.js) - Google Analytics