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