我有一个简单的脚本,它只使用 awk 从ps
.当我在终端上运行它时,它工作正常。但是,当我用 watch 运行这个脚本时:
watch bench_run.sh
根本没有输出。
脚本如下
#!/bin/bash
bench_run() {
local awk_cmd='
{
time=$10
bench=$46
start=match(bench, /throughput/)
start+=(RLENGTH+1)
end=match(bench, /base/)
printf ("%s %s\n", time, substr(bench, start, end-start-1))
}
'
ps aux | grep $USER | grep simulator | awk "$awk_cmd"
}
bench_run
手表不打印任何输出的原因可能是什么?
答案1
尝试替换ps aux
为ps auxww
以获得全宽输出。
ps
可能正在测试您的输入或 tty 并决定在内部采取不同的行为watch
。
答案2
这是改进版本的开始。到目前为止,我已将其更改为:
- 去掉
grep
s (awk
可以进行正则表达式匹配) - 更好地利用
ps
选项 - 摆脱了奇怪的 awk_cmd 局部变量
- 引用 $1 和 $46(现在是 $37,从
ps
输出中删除了 9 个不需要的字段)
#!/bin/bash
bench_run() {
ps -u "$USER" -o time,args | awk "/simulator/ {
time=\$1
bench=\$37
start=match(bench, /throughput/)
start+=(RLENGTH+1)
end=match(bench, /base/)
printf ("%s %s\n", time, substr(bench, start, end-start-1))
}
"
}
bench_run
这是一个使用的版本sed
#! /bin/sh
watch 'ps -u "$USER" -o time,args |
sed -n -e "/[s]imulator/ s/\([^ ]*\) .*\(throughput.*\)base.*/\1 \2/ p"'
我在 watch 命令周围使用了'
单引号,因此我"
在其中的 sed 命令周围使用了双引号。
如果simulator
是进程的全名,您可以使用:
#! /bin/sh
watch 'ps -o time,args -C simulator |
sed -n -e "s/\([^ ]*\) .*\(throughput.*\)base.*/\1 \2/ p"'