一些 Shell 脚本

1. 启动日志分析

  • 启动日志格式如下:
    开机时间:2015/05/13 周三 16:45:17.79
    关机时间:2015/05/13 周三 18:46:03.91
    开机时间:2015/05/14 周四 17:07:11.80
    开机时间:2015/05/14 周四 17:09:34.68
    关机时间:2015/05/14 周四 18:42:35.40

  • 转换为导入 excel 的格式:
    2015/05/13 16:45:17.79 18:46:03.91
    2015/05/14 17:07:11.80
    2015/05/14 17:09:34.68 18:42:35.40

显然有些项缺失,可能导致错误配对,但假定只有关机项会缺失吧

代码

  1. 预处理文本
    先把“时间:”替换为空格
    补充:若能进一步把 \n关机时间: 替换为空,则下一步处理会更简单!

  2. awk 处理
    Markdown 中可以用全角空格或html转义符来保持代码缩进
    半方大的空白 或 
    全方大的空白 或 
    不断行的空白格 或 


{    
          if ($1 == "开机") {    
                if (ss == 1) {
                     print ""
                }
                printf $2" "$4
           ss = 1  # 标识上次是否是开机
         } else {
            if (ss == 1) {
                print " "$4
                ss = 0
              } else {
               print $2" "$4
          }
         }    
}

运行

Windows 下可以使用 gawk_win32 来处理

2. 远程通知

项目在服务器上需要长时间编译,如何在编译完成后提醒自己?
环境:一台自己用的机器,一台服务器。

代码

服务器: echo 'Done!' | nc 127.0.0.1 9000
机器:notify-send $(nc -l 9000)

3. 并行处理文件

有N个1-2 G大的文件,其中第六列是点分表示的IPV4地址,需要把它转为整数表示。


#!/bin/awk -f
{
  len = split($6, a, ".")
  ip = 0
  if (len == 4) {
    ip = lshift(a[1], 24) + lshift(a[2], 16) + lshift(a[3], 8) + a[4]
    printf $1"\t"$2"\t"$3"\t"$4"\t"$5"\t"ip"\n" > o
  }
}

CPU是6核的,就起了6个进程去转,每个awk进程基本都是CPU 100了
但转换一个文件还是需要15分钟左右,还是太慢
求教有什么方法可以让AWK跑的更快些吗?

你可能感兴趣的:(shell)