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
이것은 개선된 버전의 시작입니다. 지금까지 나는 그것을 다음과 같이 변경했습니다.
- s 제거
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"'