awk 정규 표현식에서 환경 변수를 사용하는 방법은 무엇입니까?

awk 정규 표현식에서 환경 변수를 사용하는 방법은 무엇입니까?
#!/bin/sh
ALTER="1153"
NAME="aio"

for i in $(ps -eo pid,etime,comm | \
  awk -v alt="$ALTER" -v name="$NAME" '$2~/[^0-alt]-/ && $3~/name/{print$1} ');
do
  echo $i
done

답변1

사용할 필요가 없습니다:

for pr in $(pgrep $NAME); do 
    elapse=$(ps -o etime= -p $pr)
    [ "${elapse%-*}" -gt "$ALTER" ] && echo $pr
done

또는 기반으로스티븐 차제라스' 논평

ps -C $NAME -o pid=,etime= | awk '$2 + 0 > a && /-/ {print $1}' a="$ALTER"

답변2

이것을 사용하십시오 :

awk -v alt="$ALTER" -v name="$NAME" '
   $2 ~ /-/ && $2 >= alt && $3 ~ name{print $1}' file
  • $2 ~ /-/: 요일이 포함되어 있는지 확인하세요.
  • $2 >= alt: 일수가 보다 etime큰지 확인합니다 $ALTER.
  • $3 ~ name: 세 번째 필드에서 name( ) 값을 검색합니다.$NAME

또 다른 순수한 bash솔루션:

ps -eo pid,etime,comm | while read p e n; do
  if [[ $n =~ $NAME ]] && [[ $e =~ \- ]] && [ "${e%%-*}" -gt "$ALTER" ]; then 
    echo $p
  fi
done
  • while read p e npid, etime 및 명령 이름을 변수 및 에 $p저장 $e합니다 $n.
    • [[ $n =~ $NAME ]]: 명령 $NAME에 내용이 있는지 확인하십시오.
    • [[ $e =~ \- ]]: etime에 대시(-)가 있는지 확인(프로세스가 하루 이상 실행되었음을 나타냄)
    • [ "${e%%-*}" -ge "$ALTER" ]: etime의 일 카운터가 다음 값보다 크거나 같은지 확인합니다.$ALTER
  • 위의 조건이 모두 충족되면 pid를 인쇄합니다.echo $p

관련 정보