Linux 用我的awk脚本删除无用/空行

Linux 用我的awk脚本删除无用/空行,linux,bash,csv,awk,Linux,Bash,Csv,Awk,对于bash/html中的CGI,我有以下脚本(仅awk脚本,其余代码只是一个简单的hmtl代码): 我的脚本分析许多CSV文件并显示我需要的信息,如下所示: DATE ========================== : 20180122 LPARS :miaibye01 RAM : 60 CPU 1 : 1.0 CPU 2 : 2 LPARS :miaibg04 RAM : 99 CPU 1 : 1.5 CPU 2 : 3 LPARS :miaibk07 RAM : 52

对于bash/html中的CGI,我有以下脚本(仅awk脚本,其余代码只是一个简单的hmtl代码):

我的脚本分析许多CSV文件并显示我需要的信息,如下所示:

DATE ========================== : 20180122

LPARS :miaibye01
RAM : 60
CPU 1 : 1.0
CPU 2 : 2



LPARS :miaibg04
RAM : 99
CPU 1 : 1.5
CPU 2 : 3



LPARS :miaibk07
RAM : 52
CPU 1 : 2.5
CPU 2 : 5

DATE ========================== : 20180124

LPARS :miaibye01
RAM : 60
CPU 1 : 1.0
CPU 2 : 2



LPARS :miaibg04
RAM : 99
CPU 1 : 1.5
CPU 2 : 3



LPARS :miaibk07
RAM : 52
CPU 1 : 2.5
CPU 2 : 5



LPARS :miaibv176
RAM : 0.25
CPU 1 : 0.1
CPU 2 : 1

...

但有时,当我的脚本没有找到所请求的信息时,它会显示所请求的信息,并调整脚本搜索信息的文件的日期。输出为:

DATE ========================== : 20180923
DATE ========================== : 20180924
DATE ========================== : 20180925
DATE ========================== : 20180926
DATE ========================== : 20180927
DATE ========================== : 20180928
DATE ========================== : 20180929
DATE ========================== : 20180930
DATE ========================== : 20181001

我搜索了如何删除(或不显示)这些无用的行与我的awk脚本,但我不知道如何。。。您有什么想法吗?

您只需执行以下操作:

for fn in /var/www/cgi-bin/LPAR_MAP/*; do
    awk -F',|;' -v test="$test" '
       NR==1 { 
         split(FILENAME ,a,"[-.]");
       }
       $0 ~ test {
           if(!header++){
               print "DATE ========================== : " a[4] 
           }
           print ""
           print "LPARS :" $2
           print "RAM : " $5
           print "CPU 1 : " $6
           print "CPU 2 : " $7
           print "" 
           print ""
       }' $fn;
done
我只在$0~$test第一次打印标题。
注意,我对您的代码做了一点修改,以创建一个等于
$test
的awk变量。它对代码注入更加健壮。

您只需执行以下操作:

for fn in /var/www/cgi-bin/LPAR_MAP/*; do
    awk -F',|;' -v test="$test" '
       NR==1 { 
         split(FILENAME ,a,"[-.]");
       }
       $0 ~ test {
           if(!header++){
               print "DATE ========================== : " a[4] 
           }
           print ""
           print "LPARS :" $2
           print "RAM : " $5
           print "CPU 1 : " $6
           print "CPU 2 : " $7
           print "" 
           print ""
       }' $fn;
done
我只在$0~$test第一次打印标题。
注意,我对您的代码做了一点修改,以创建一个等于
$test
的awk变量。它对代码注入更加健壮。

这不需要shell循环,只需要:

awk -F'[,;]' -v test="$test" '
    FNR==1 { doneHdr = 0 }
    $0 ~ test {
        if ( !doneHdr++ ) {
            split(FILENAME,a,/[-.]/)
            print "DATE ========================== : " a[4]
        }
        print ""
        print "LPARS :" $2
        print "RAM : " $5
        print "CPU 1 : " $6
        print "CPU 2 : " $7
        print "" 
        print ""
    }
' /var/www/cgi-bin/LPAR_MAP/*

对此,您不需要shell循环,只需要:

awk -F'[,;]' -v test="$test" '
    FNR==1 { doneHdr = 0 }
    $0 ~ test {
        if ( !doneHdr++ ) {
            split(FILENAME,a,/[-.]/)
            print "DATE ========================== : " a[4]
        }
        print ""
        print "LPARS :" $2
        print "RAM : " $5
        print "CPU 1 : " $6
        print "CPU 2 : " $7
        print "" 
        print ""
    }
' /var/www/cgi-bin/LPAR_MAP/*

谢谢@EdMorton!你好您的解决方案工作得很好,但正如您在这里看到的(),即使没有显示无用的行,仍然会生成表!你有什么办法解决这个问题吗?我没有任何关于那个图像的背景。。。你从哪里弄来的?你好!对于您的脚本,如果我的脚本找不到信息,则可以不显示“Date===XXX”行。但是,即使没有信息,应该接收信息的html列仍然会生成和显示(即图片右侧的空列),我不知道如何生成这些html列。我认为我们应该看到代码的其余部分,如果您在上面添加一个带有适当标记的其他问题,可能会更具可读性。谢谢@EdMorton!你好您的解决方案工作得很好,但正如您在这里看到的(),即使没有显示无用的行,仍然会生成表!你有什么办法解决这个问题吗?我没有任何关于那个图像的背景。。。你从哪里弄来的?你好!对于您的脚本,如果我的脚本找不到信息,则可以不显示“Date===XXX”行。但是,即使没有信息,应该接收信息的html列仍然会生成和显示(即图片右侧的空列),我不知道如何生成这些html列。我认为我们应该看到代码的其余部分,如果您在上面添加一个带有适当标记的其他问题,那么代码的可读性可能会更高。您好!谢谢你的帮助!非常有用!!你能不能快速解释一下这些行的功能:“test=“$test”'FNR==1{doneHdr=0}$0~test{if(!doneHdr++)”?非常感谢!
-v test=“$test”
正在将一个名为
test
的awk变量设置为您现有的shell变量(也名为
test
)-请参阅。
$0~test
只是更正了您现有
/'$test'/
的语法。`FNR==1{doneHdr=0}`正在读取每个新输入文件的开始时清除一个标志。
如果(!doneHdr++)x
将执行
x
并在第一次点击时将标志设置为1,之后
x
将不会在标志为非零时再次执行(即对于当前输入文件的其余部分)。您好!感谢您的帮助!非常有帮助!!您能否快速解释这些行的功能:“test=“$test”'FNR==1{doneHdr=0}$0~test{if(!doneHdr++)“?非常感谢!
-v test=“$test”
正在将一个名为
test
的awk变量设置为您现有的shell变量(也称为
test
)的级别,请参见。
$0~test
只是对您现有的
/'$test'//code>`FNR==1的语法进行了更正{doneHdr=0}`正在读取每个新输入文件的开始时清除一个标志。
如果(!doneHdr++)x
将执行
x
并在第一次命中该标志时将其设置为1,此后
x
将不再执行,而标志为非零(即对于当前输入文件的其余部分)。