【问题标题】:How to display the output of my script in column with bash/awk?如何使用 bash/awk 在列中显示我的脚本的输出?
【发布时间】:2019-11-19 08:34:48
【问题描述】:

我在 bash/html 中开发了一个 CGI。

使用这个 CGI,我可以显示 csv 文件中的一些信息。

这些信息之一是不同FRAME的RAM和CPU消耗。

为了显示这些信息,我创建了这个页面:

#!/bin/bash


echo "Content-type: text/html"
echo ""

echo '
<html>
        <head>
                <meta http-equiv="Content-Type" content="test/html"; charset=UTF-8">
                <title> CLF MONITORING </title>
                <h1> FRAME monitoring <font size=3> <a href="Index.sh">[ Index ]</a> </font> </h1>
                <hr size="4" color="blue">

        <style>
                         body{
                          background-color: #eff1f0;
                         }
        </style>

        </head>
<body>'

echo "<table>"
echo "<tr>"

echo "<td>"
echo "<PRE>"
echo "`./FRAME_SCRIPT.sh cccc.csv bbbb.csv`"
echo "</td>"
echo "</tr>"
echo "</PRE>"
echo "</table>"
echo '</body>'
'</html>'

我的脚本“FRAME_SCRIPT.sh”显示来自不同 csv 文件的有关 FRAME 的信息。这里是脚本

#!/bin/bash

OLDIFS=$IFS
IFS=','

for arg
do
echo -e "File : $arg "
echo "======================================================="
echo ""
while read FRAME RAM CPU1 CPU2
do
if [[ $FRAME != $PREV ]]
then
PREV=$FRAME
echo "FRAME : $FRAME"
echo -e "-----------------\n"
fi
echo -e "RAM : \t$RAM\n\
CPU 1 :\t$CPU1\n\
CPU 2 :\t$CPU2\n"
echo ""
done < "$arg"
done 

我用命令运行它:

./My_script.sh *.csv

输出是:

File : cccc.csv 
=======================================================

FRAME : MIAIBB00
-----------------

RAM :   
CPU 1 : 
CPU 2 : 


FRAME : MIAIBTST1
-----------------

RAM :   
CPU 1 : 
CPU 2 : 


FRAME : MIAIBYC00
-----------------

RAM :   8
CPU 1 : 2.0
CPU 2 : 4


RAM :   5
CPU 1 : 0.1
CPU 2 : 1


RAM :   6
CPU 1 : 0.2
CPU 2 : 1


RAM :   0.25
CPU 1 : 0.2
CPU 2 : 1


RAM :   64
CPU 1 : 3.0
CPU 2 : 7


RAM :   80
CPU 1 : 20.0
CPU 2 : 20


RAM :   8
CPU 1 : 1.0
CPU 2 : 2


RAM :   4
CPU 1 : 1.0
CPU 2 : 2


RAM :   4
CPU 1 : 1.0
CPU 2 : 2


RAM :   0
CPU 1 : null
CPU 2 : 0


File : bbbb.csv 
=======================================================


FRAME : MO1PPC02
-----------------

RAM :   12
CPU 1 : 0.3
CPU 2 : 2


RAM :   8
CPU 1 : 0.2
CPU 2 : 2


RAM :   15
CPU 1 : 0.8
CPU 2 : 2


RAM :   8
CPU 1 : 0.5
CPU 2 : 1


RAM :   36
CPU 1 : 2.0
CPU 2 : 4


RAM :   48
CPU 1 : 8.0
CPU 2 : 12


RAM :   8
CPU 1 : 0.2
CPU 2 : 2


RAM :   8
CPU 1 : 0.2
CPU 2 : 2


RAM :   31
CPU 1 : 2.0
CPU 2 : 8

但我想在我的网页上显示这样的信息:

这个想法是当每次模式“文件:XXXX”出现时,这个带有他自己信息的模式都会显示在一个新的列中,在之前的模式“文件:XXXX”旁边。

我认为如果我们使用“File:”这样的键模式,这是可能的。我不能使用文件的名称,因为它从来都不是同一个。也许可以做到这一点,但我不知道如何......

在我的示例中,我在一个只有 2 个 csv 文件的目录中运行我的脚本,但实际上,我有更多的 csv 文件。所以在这种情况下,为了更清楚,我只使用了 2 个 csv。

你有什么想法吗?

【问题讨论】:

  • 您好,我在添加更多细节时会尝试更清楚! :)
  • 您没有添加我要求的详细信息,尽管您以 CSV 文件作为输入开始。我自己写的,见my answer
  • 顺便说一句,您的 &lt;/PRE&gt; 应该在 &lt;/td&gt;&lt;/tr&gt; 之前,而不是之后。

标签: linux bash csv awk


【解决方案1】:

不要使用 shell 循环来操作文本(请参阅 why-is-using-a-shell-loop-to-process-text-considered-bad-practice)。

如果我是你,我会将输出格式化为 HTML 表格而不是预先格式化的文本,但只需按照以下步骤查看获得所需输出的一种方法:

$ cat ../tst.awk
BEGIN {
    FS = ","
    OFS = " : "
    split("FRAME,RAM,CPU 1,CPU 2", titles)
}

FNR == 1 {
    close(out)
    out = "out" ++cnt ".txt"
    print "File", FILENAME ORS "===================="   > out
}

$1 != prev {
    print "" ORS fmt(1) "\n--------------------\n"      > out
    prev = $1
}

{
    for (i=2; i<=NF; i++) {
        print fmt(i)                                    > out
    }
    print ""                                            > out
}

function fmt(fldNr) { return sprintf("%-8s%s", titles[fldNr] OFS, $fldNr) }

.

$ ls
bbbb.csv  cccc.csv

.

$ tail -n +1 *.csv
==> bbbb.csv <==
MO1PPC02,12,0.3,2
MO1PPC02,8,0.2,2
MO1PPC02,15,0.8,2
MO1PPC02,8,0.5,1
MO1PPC02,36,2.0,4
MO1PPC02,48,8.0,12
MO1PPC02,8,0.2,2
MO1PPC02,8,0.2,2
MO1PPC02,31,2.0,8

==> cccc.csv <==
MIAIBB00,,,
MIAIBTST1,,,
MIAIBYC00,8,2.0,4
MIAIBYC00,5,0.1,1
MIAIBYC00,6,0.2,1
MIAIBYC00,0.25,0.2,1
MIAIBYC00,64,3.0,7
MIAIBYC00,80,20.0,20
MIAIBYC00,8,1.0,2
MIAIBYC00,4,1.0,2
MIAIBYC00,4,1.0,2
MIAIBYC00,0,null,0

.

$ awk -f ../tst.awk cccc.csv bbbb.csv

.

$ ls
bbbb.csv  cccc.csv  out1.txt  out2.txt

.

$ tail -n +1 *.txt
==> out1.txt <==
File : cccc.csv
====================

FRAME : MIAIBB00
--------------------

RAM :
CPU 1 :
CPU 2 :


FRAME : MIAIBTST1
--------------------

RAM :
CPU 1 :
CPU 2 :


FRAME : MIAIBYC00
--------------------

RAM :   8
CPU 1 : 2.0
CPU 2 : 4

RAM :   5
CPU 1 : 0.1
CPU 2 : 1

RAM :   6
CPU 1 : 0.2
CPU 2 : 1

RAM :   0.25
CPU 1 : 0.2
CPU 2 : 1

RAM :   64
CPU 1 : 3.0
CPU 2 : 7

RAM :   80
CPU 1 : 20.0
CPU 2 : 20

RAM :   8
CPU 1 : 1.0
CPU 2 : 2

RAM :   4
CPU 1 : 1.0
CPU 2 : 2

RAM :   4
CPU 1 : 1.0
CPU 2 : 2

RAM :   0
CPU 1 : null
CPU 2 : 0


==> out2.txt <==
File : bbbb.csv
====================

FRAME : MO1PPC02
--------------------

RAM :   12
CPU 1 : 0.3
CPU 2 : 2

RAM :   8
CPU 1 : 0.2
CPU 2 : 2

RAM :   15
CPU 1 : 0.8
CPU 2 : 2

RAM :   8
CPU 1 : 0.5
CPU 2 : 1

RAM :   36
CPU 1 : 2.0
CPU 2 : 4

RAM :   48
CPU 1 : 8.0
CPU 2 : 12

RAM :   8
CPU 1 : 0.2
CPU 2 : 2

RAM :   8
CPU 1 : 0.2
CPU 2 : 2

RAM :   31
CPU 1 : 2.0
CPU 2 : 8

.

$ paste *.txt
File : cccc.csv File : bbbb.csv
====================    ====================

FRAME : MIAIBB00        FRAME : MO1PPC02
--------------------    --------------------

RAM :           RAM :   12
CPU 1 :         CPU 1 : 0.3
CPU 2 :         CPU 2 : 2

        RAM :   8
FRAME : MIAIBTST1       CPU 1 : 0.2
--------------------    CPU 2 : 2

RAM :           RAM :   15
CPU 1 :         CPU 1 : 0.8
CPU 2 :         CPU 2 : 2

        RAM :   8
FRAME : MIAIBYC00       CPU 1 : 0.5
--------------------    CPU 2 : 1

RAM :   8       RAM :   36
CPU 1 : 2.0     CPU 1 : 2.0
CPU 2 : 4       CPU 2 : 4

RAM :   5       RAM :   48
CPU 1 : 0.1     CPU 1 : 8.0
CPU 2 : 1       CPU 2 : 12

RAM :   6       RAM :   8
CPU 1 : 0.2     CPU 1 : 0.2
CPU 2 : 1       CPU 2 : 2

RAM :   0.25    RAM :   8
CPU 1 : 0.2     CPU 1 : 0.2
CPU 2 : 1       CPU 2 : 2

RAM :   64      RAM :   31
CPU 1 : 3.0     CPU 1 : 2.0
CPU 2 : 7       CPU 2 : 8

RAM :   80
CPU 1 : 20.0
CPU 2 : 20

RAM :   8
CPU 1 : 1.0
CPU 2 : 2

RAM :   4
CPU 1 : 1.0
CPU 2 : 2

RAM :   4
CPU 1 : 1.0
CPU 2 : 2

RAM :   0
CPU 1 : null
CPU 2 : 0

.

$ paste *.txt | column -L -s$'\t' -t
File : cccc.csv       File : bbbb.csv
====================  ====================

FRAME : MIAIBB00      FRAME : MO1PPC02
--------------------  --------------------

RAM :                 RAM :   12
CPU 1 :               CPU 1 : 0.3
CPU 2 :               CPU 2 : 2

                      RAM :   8
FRAME : MIAIBTST1     CPU 1 : 0.2
--------------------  CPU 2 : 2

RAM :                 RAM :   15
CPU 1 :               CPU 1 : 0.8
CPU 2 :               CPU 2 : 2

                      RAM :   8
FRAME : MIAIBYC00     CPU 1 : 0.5
--------------------  CPU 2 : 1

RAM :   8             RAM :   36
CPU 1 : 2.0           CPU 1 : 2.0
CPU 2 : 4             CPU 2 : 4

RAM :   5             RAM :   48
CPU 1 : 0.1           CPU 1 : 8.0
CPU 2 : 1             CPU 2 : 12

RAM :   6             RAM :   8
CPU 1 : 0.2           CPU 1 : 0.2
CPU 2 : 1             CPU 2 : 2

RAM :   0.25          RAM :   8
CPU 1 : 0.2           CPU 1 : 0.2
CPU 2 : 1             CPU 2 : 2

RAM :   64            RAM :   31
CPU 1 : 3.0           CPU 1 : 2.0
CPU 2 : 7             CPU 2 : 8

RAM :   80
CPU 1 : 20.0
CPU 2 : 20

RAM :   8
CPU 1 : 1.0
CPU 2 : 2

RAM :   4
CPU 1 : 1.0
CPU 2 : 2

RAM :   4
CPU 1 : 1.0
CPU 2 : 2

RAM :   0
CPU 1 : null
CPU 2 : 0

【讨论】:

    猜你喜欢
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多