使用awk的bash脚本 - 打印不需要的换行符?

时间:2017-04-29 23:20:05

标签: bash awk

我正在为一个类赋值编写一个bash脚本,我从awk中得到了一些非常奇怪的行为。看起来它正在为单个\ n字符编写两个换行符。以下是相关代码的一部分:

iterate () {
    for (( i=0; i<$2; i++ )); do
        echo -n $(date +%H:%M:%S) >> cpu_usage.plot
        echo -n $(date +%H:%M:%S) >> disk_usage.plot
        mpstat | awk 'NR>3 { printf "\t"$4"\t"$6"\t"$13"\n" }' >> cpu_usage.plot
        iostat | awk 'NR>6 { printf "\t"$3"\t"$4"\n" }' >> disk_usage.plot
        sleep $1
    done
}

cpu_usage.plot的输出很好,但是disk_usage.plot的输出是错误的。它在每次迭代之间打印一个新行太多。

执行后来自cpu_usage.plot的相关行:

17:33:28    0.64    0.02    99.33
17:33:30    0.64    0.02    99.33
17:33:32    0.64    0.02    99.33
17:33:34    0.64    0.02    99.33

来自disk_usage.plot:

17:33:28    2.16    50.90

17:33:30    2.16    50.90

17:33:32    2.16    50.90

17:33:34    2.16    50.90

我通常认为这是一个问题,它从iostat或其他东西中获取额外的换行符,但似乎并非如此。将第6行更改为:

iostat | awk 'NR>6 { printf "\t"$3"\t"$4 }' >> disk_usage.plot # removing the "\n"

根本不打印任何换行符;整个事情都在一条线上。对于要抓取哪些行的条件而言,如果想要进一步分解,那么无论如何,使用NR> 6,它会抓取正确的数据。

对我来说,两个命令几乎完全相同,除了它的输入和发送输出的地方之外,这真的很奇怪,但是一个正确,另一个没有。对StackOverflow的搜索产生了this,我认为这可能会有所帮助,但它们似乎有一个不同的问题。我承认我对awk来说是全新的,但我在这里完全不知所措。有人有什么想法吗?

1 个答案:

答案 0 :(得分:1)

iostat输出一个尾随空行。我建议:

iostat | awk 'NR>6 && $0 != "" { printf "\t"$3"\t"$4"\n" }' >> disk_usage.plot

iostat | awk 'NR>6 && $0 != "" { print "\t"$3"\t"$4 }' >> disk_usage.plot