awk:使用bash变量将结果发送到名为的文件

awk:使用bash变量将结果发送到名为的文件,bash,file,variables,awk,send,Bash,File,Variables,Awk,Send,我有一个bash变量LOG\u FILENAME,它存储日志文件的名称。我想要什么 要做的是启动iostat-xnmp,并获取存储在bash variableDEVICE中的每个迭代匹配模式的每个记录的字段9、10和11。迭代次数存储在timebash变量中。我试图做的是: iostat -xnmp 5 $time | awk -v log=$LOG_FILENAME "/$DEVICE/" '{print $9" "$10" "$11}' input >> $log 与ENVIR

我有一个bash变量
LOG\u FILENAME
,它存储日志文件的名称。我想要什么 要做的是启动iostat-xnmp,并获取存储在bash variable
DEVICE
中的每个迭代匹配模式的每个记录的字段9、10和11。迭代次数存储在
time
bash变量中。我试图做的是:

iostat -xnmp 5 $time | awk -v log=$LOG_FILENAME "/$DEVICE/" '{print $9" "$10" "$11}' input >> $log
ENVIRON
和其他人有很多不同…但仍然无法找出我错在哪里。大多数时候我都会遇到语法错误。目前还没有特别的要求,所以任何解决方案都是合适的。

如果设备结构良好(例如,不包含
/
),则以下两种方法中的任何一种都应该有效:

... | awk  "/$DEVICE/"'{print $9, $10, $11}' OFS=' ' >> $LOG_FILENAME
(注意:
之间不能有任何空格) 或

我对这一点的看法(一行可以,但人类更容易把它作为单独的行来阅读):


您从stdin中读取。
index($0,dev)>0
之所以被使用,是因为我认为您脑子里只有一个磁盘设备。
index($0,dev)>0
可以缩短为
index($0,dev)
,对于学习awk的人来说,这不太清晰。

我没有看到“输入”的位置“完全定义了-awk读取stdin.OK,第一个有效:)但我感兴趣的是:只有当所有iostat迭代完成时,文件大小才会增加。所以,如果我破坏了执行,就不会有任何东西进入文件。还有另一个问题让我担心:如果我告诉iostat进行大量迭代,这会起作用吗?我需要它运行3-7天。使用第二个版本,并在print命令后添加
close log
,以刷新输出。当第一个版本运行时,我使用第二个版本时出现语法错误。操作系统是Solaris 10,但我无法确定awk的版本(--v、--version和--help不起作用)。如果这意味着什么…你会犯什么错误<代码>语法错误不是特别描述性的。这也会导致语法错误消息。我对它进行了如下修改:iostat-xnmp 5$time | awk-v dev=$DEVICE-v log=$log_FILENAME'index($0,dev)>0{print$9,$10,$11}'>>log,但这会导致变量$log的重定向错误模棱两可。我的错-在$time之前丢失“5”。一般来说,这类问题很难回答。通过显示脚本和所需输出,您将获得更好的答案。嗯,脚本并不是很有趣$设备变量是手动填充的,因此$time(它是一个脚本参数)也是如此$LOG_FILENAME将日期和设备名称存储在一个字符串中。这就是全部。。。我希望用户像这样启动脚本(例如):脚本5c0t2d0,我需要它将信息生成带有时间戳的文件。起初,我用另一种方式使它工作(不让iostat进行迭代),但这只提供了平均磁盘使用率信息,因此我需要直接将参数传递给iostat并将其发送到文件中。您必须引用shell变量,例如,
“$time”
,而不是
$time
。总是引用所有的shell变量,除非你有一个非常具体的原因不知道你在做什么,否则你现在或将来都会被神秘的、意外的结果(google it)咬到。做到了这一点,但每次迭代都会得到一个名为奇怪的新文件。
... | awk 'match($0, device) {print $9, $10, $11 >> log}' OFS=' ' \
            device="$DEVICE" log=$LOG_FILENAME
iostat -xnmp  $time | 
awk -v dev=$DEVICE  'index($0,dev)>0 {print $9,$10,$11}' >> $log