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)
我现在有两个问题:
最大的改进将是完全避免 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)