从日志文件中选择一行中的剩余文本

Azi*_*zos 2 command-line bash text-processing

我正在使用 Bash shell 处理一些日志文件,我需要将这些文件放入 CSV 文件中。信息I的需要是处理的开始日期和时间过程结束日期和时间进程ID消息

我所做的是,grep 行包括启动进程并将它们放入一个文件中,然后 Grep 结束进程并将它们放入第二个文件中。完成后,我获取每个文件,并使用 awk 拆分和提取所需的信息,这是我正在使用的代码的和平,

input=starts.txt
while IFS= read -r line
do
    procs=`echo $line | awk  '{ print $6;}' 
    date_s=`echo $line | awk '{ print $1;}'`
    time_s=`echo $line |  awk '{ print $2;}'`
    m1=`echo $line |  awk '{ print $3;}'`
    m2=`echo $line |  awk '{ print $4;}'`
    m3=`echo $line |  awk '{ print $5;}'`
    m4=`echo $line |  awk '{ print $7;}'`
    m5=`echo $line |  awk '{ print $8;}'`
    m6=`echo $line |  awk '{ print $9;}'`

 echo $procs ";" $date_s ";" $time_s ";" $m1 $m2  $m3 $m4 $m5 $m6 

one   < "$input" > result.csv
Run Code Online (Sandbox Code Playgroud)

这些行具有以下格式:

02/01/2018 10:32:35      ANR4930I Reclamation process 1320 started for primary      storage pool VM_VTL_POOL automatically, threshold=75,     duration=None. (PROCESS: 1320) 
Run Code Online (Sandbox Code Playgroud)

我现在有两个问题:

  1. while 循环并没有结束。
  2. 提取时间/日期和进程 ID 后,我想将剩余的消息放在一个单独的字段中,而不是逐字逐句地将它们连接起来 (m1 m2 m 3 ...) 另外,如果有任何可以做的改进到我的代码。

ste*_*ver 5

最大的改进将是完全避免 shell 循环并直接在 awk 中处理每条记录(行)。例如:

$ awk '{
    printf("%s;%s;%s;", $6, $1, $2)
    for(i=3; i<NF;i++) {
      if(i==6) continue; 
      printf("%s ", $i)
    }
    printf("%s\n",$NF)
  }' input
1320;02/01/2018;10:32:35;ANR4930I Reclamation process started for primary storage pool VM_VTL_POOL automatically, threshold=75, duration=None. (PROCESS: 1320)
Run Code Online (Sandbox Code Playgroud)