【问题标题】:Issue with using newline in awk在 awk 中使用换行符的问题
【发布时间】:2014-11-26 15:21:24
【问题描述】:

我试图在我的 Linux (Centos) 机器上以 csv 格式输出以下列:

"timestamp" "date" "process name" "process id" "%memory"

下面是我的代码:

tdydate=$(date +'%m-%d-%Y %H:%M:%S')
ip=$(ip route get 8.8.8.8 | awk 'NR==1 {print $NF}')

echo $tdydate "," $ip "," $(top -b -n 1 | awk 'BEGIN {RS = "\n"} NR>7 {print $12,$1,$10}') > procinfo.csv

但是,正如预期的那样,它不会在换行符中打印信息。虽然,当我在下面做时,它工作得非常好,并以所需的格式打印所有必需的信息:-

top -b -n 1 | awk 'BEGIN {RS = "\n"} NR>7 {print $12,$1,$10}' > procinfo.csv

当我尝试使用 echo 打印时间戳和 ip 时,格式变为单行。有人可以纠正我的错误吗?

所需的输出应采用以下格式:-

第一列是时间戳,第二列是ip,第三列是进程名,第四列是进程id,第五列是%memory。它应该是逗号分隔值(一个 csv 作为输出)。

【问题讨论】:

  • 将整个字符串引用到echo。如果变量不加引号,那么 shell 会吃掉空格。
  • 嗨,这没用。你的意思是:- echo "$tdydate "," $ip "," $(top -b -n 1 | awk 'BEGIN {RS = "\n"} NR>7 {print $12,$1,$10}' )" > procinfo.csv
  • top/awk 输出是否创建多行?那么你不能用一个echo 来做到这一点。而是将前两个静态字段粘贴在 awk 打印 awk -v date="$tdydate" -v ip="$ip" '....{print date","ip","$12,$1,$10}'
  • 我不明白这里有什么问题。所需的输出根本不清楚。我只能看到一行,没有逗号分隔任何数据。请编辑您的问题,显示您所需输出的确切示例。

标签: memory awk newline


【解决方案1】:

你的回声语句应该是这样的:

echo "$tdydate , $ip , $(top -b -n 1 | awk 'NR>7 {print $12,$1,$10}')" > procinfo.csv

除了将整个内容用双引号括起来以保留空白之外,我还删除了对RS 的分配。我认为这不是必需的,因为默认值是您平台上的换行符。

【讨论】:

  • 嗨,这很遗憾没有奏效。它以 CSV 格式输出如下:- 11/26/2014 20:29 192.168.0.38 top 1681105 0.0 init 1 0.0 kthreadd 2 0.0 migration/0 3 0.0 ksoftirqd/0 4 0.0 migration/0 5 0.0 watchdog/0 6 0.0 migration /1 7 0.0 迁移/1 8 0.0
  • 从您的评论中不清楚该输出是如何格式化的,从您的问题中也不清楚所需的输出格式是什么。请编辑您的问题以显示您希望输出的外观。
  • 谢谢汤姆,我已经在我的问题中添加了所需的输出格式。请指教..谢谢。
猜你喜欢
  • 2020-06-05
  • 2014-08-25
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多