ps
端末でawkを使用する簡単なスクリプトがあります。ただし、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
に置き換えます。入力またはttyがテスト中で内部的に異なる動作をすることを決定した可能性があります。ps auxww
ps
watch
答え2
これは改善されたバージョンの始まりです。これまで私はそれを次のように変更しました。
- ■削除
grep
(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"'