표시하지 않고 스크립트의 출력을 관찰합니다.

표시하지 않고 스크립트의 출력을 관찰합니다.

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 auxwwpswatch

답변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"'

관련 정보