Bash 处理文本文件中的数据并转换为csv

Bash 处理文本文件中的数据并转换为csv,bash,shell,awk,sed,Bash,Shell,Awk,Sed,在我们的组织中,每个月都会有一些作业在服务器级别运行和收集数据,它会找到服务器上运行的内容,并执行一些检查。这些文件是文本文件,并复制到一个存储库服务器。文件名将为\u 20200911.log 此示例文件检查运行postgreSQL的服务器 Date Collected || 11-10-2020 03:20:42 GMT || Server Name || pglinux1 || Operati

在我们的组织中,每个月都会有一些作业在服务器级别运行和收集数据,它会找到服务器上运行的内容,并执行一些检查。这些文件是文本文件,并复制到一个存储库服务器。文件名将为
\u 20200911.log

此示例文件检查运行postgreSQL的服务器

Date Collected                  || 11-10-2020 03:20:42 GMT ||
Server Name                     || pglinux1             ||
Operating system                || RHEL                     || passed
OS Version                      || 6.9                      || passed
Kernel version                  || 2.6.32-735.23.1.el6      || passed
Kernel architecture             || x86-64                   || passed
Total Memory                    || 16 gig                   || passed
/opt/postgres fs free           || 32 gig                   || passed
/opt/postgres/data fs free      || 54 gig                   || passed
Is cron jobs exist              || yes                      || passed
Is postgres installed           || yes                      || passed
Postgres version >10            || no                       || failed
repmgr installed                || yes                      || passed
repmgr version  >4              || yes                      || passed
How may pg cluster running      || 3                        || Passed
pgbackrest installed            || yes                      || passed
我们将获得不同技术的类似文件,如oracle、mysql、weblogic。。。每个月,我们都需要处理这些文件,识别失败的检查,并与相应的团队合作。现在我正在整合所有postgreSQL/oracle的数据。在我的例子中,我将获得很多文件,读取每个文本文件,并将数据转换为cvs,如下所示

Date Collected, server name, OPerating system , OS Version,Kernel version,Kernel architecture,Total Memory, /opt/postgres fs free,/opt/postgres/data fs free,Is cron jobs exist,    
11-10-2020 03:20:42 GMT,pglinux1, RHEL, passed, passed, passed, passed , passed , passed, passed passed, failed  
11-10-2020 03:20:42 GMT,pglinux2, RHEL, passed, passed, passed, passed , passed , passed, passed passed, failed  
11-10-2020 03:20:42 GMT,pglinux3, RHEL, passed, passed, passed, passed , passed , passed, passed passed, failed
最初我认为,将这些文本文件转换为CSV,然后从每个文件中选择第二行,将其合并为一个文件。我这次尝试失败了,因为有些文件数据不一致。现在我想创建一个名为
servercheck.txt的文件,其中包含所有检查。使用此检查文件对所有文件中的数据进行grep,并打印到CSV文件中(每台服务器一行)

#/bin/bash
awk-v ORS='{print$0',“}/tmp/servecheck.txt | sed's/*$//g'>serverchecks.csv
对于'ls-lart*2020091t.log | awk'{print$9}中的文件`
做
读行时
做
grep“$line”$file | awk-F”| |“{print$3}”| awk-v ORS='{print$3',“}'>>serverchecks.csv
完成
上述代码将数据写入同一行(标题和数据)

我希望我已经提供了所有必要的细节。请帮助我们提供代码、建议和处理此问题的最佳方法。

这可能会对您有所帮助

for inputfile in *
do
  awk -F "\|\|" '
    { 
    for (i=1; i<=NF; i++)  {
      a[NR,i] = $i
    }
}   
NF>p { p = NF }
END {    
     for(j=1; j<=p; j++) {
        str=a[1,j]
     for(i=2; i<=NR; i++){
        str=str" "a[i,j];
     }
    print str
   }
  }' $inputfile| sed 's/ \+ /,/g' > tmpfile && mv tmpfile "$inputfile"
done  
中输入文件的
*
做
awk-F“\\\\\”'
{ 
对于(i=1;ip{p=NF}
结束{
对于(j=1;j这可能会对您有所帮助

for inputfile in *
do
  awk -F "\|\|" '
    { 
    for (i=1; i<=NF; i++)  {
      a[NR,i] = $i
    }
}   
NF>p { p = NF }
END {    
     for(j=1; j<=p; j++) {
        str=a[1,j]
     for(i=2; i<=NR; i++){
        str=str" "a[i,j];
     }
    print str
   }
  }' $inputfile| sed 's/ \+ /,/g' > tmpfile && mv tmpfile "$inputfile"
done  
中输入文件的
*
做
awk-F“\\\\\”'
{ 
对于(i=1;ip{p=NF}
结束{

对于(j=1;jCheck您的脚本。修复所有错误…修复您的awk语法。您是否有任何理由在csv文件中需要前导空格?示例输入文件有16行,而所需输出有10个标题列和9个数据列;您能否a)验证您发布的所需输出,以及2)如何确定源代码中的哪些行应作为列包含在所需输出中?@KamilCuk,我现在将检查我的代码并返回给您。
并从每个文件中选择第二行。
-您的示例输出显示第二行的3行和第三行的其余输出。那么第二行还是第三行呢?(老实说,你应该和另一方谈谈,告诉他们输出机器可解析格式,最有可能是json)@KamilCuk,最初我尝试使用代码``BEGIN{FS=“| |”OFS=“,”}{printf“%s%s”,(FNR>1?OFS:),$argid}ENDFILE{print'',如果(argd并从每个文件中选择第二行。
-您的示例输出显示第二行的3行和第三行的其余输出。那么第二行还是第三行呢?(老实说,你应该和另一方谈谈,告诉他们输出机器可解析格式,最有可能是json)@KamilCuk,最初我尝试使用代码``BEGIN{FS=“| |”OFS=“,”}{printf“%s%s”,(FNR>1?OFS:),$argid}ENDFILE{print'',如果(argdawk'{print str}“|sed's/\+/,/g”
=
awk'{gsub(/\+/,”,“,”,str);print str}
。在使用awk时,您永远不需要从sed到sed的管道。
awk'{print str}sed's/\+/,/g'
=
awk'{gsub(/\+/,“,”,str str);print str}'
。在使用awk时,您永远不需要从sed到sed的管道。
for inputfile in *
  do 
  awk -F "\|\|" '
   { 
    for (i=1; i<=NF; i++)  {
    a[NR,i] = $i
 }
 }   
  NF>p { p = NF }
  END {    
  for(j=1; j<=p; j++) {
    str=a[1,j]
 for(i=2; i<=NR; i++){
    str=str" "a[i,j];
 }
{gsub(/ \+ /,",",str); print str}
}
}' $inputfile > tmpfile && mv tmpfile "$inputfile"
done