我正在为一个类赋值编写一个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来说是全新的,但我在这里完全不知所措。有人有什么想法吗?
答案 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