Como posso usar as variáveis de ambiente dentro de uma expressão regular no awk?

1
#!/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
    
por JuM 07.10.2015 / 10:25

2 respostas

3

Não há necessidade de usar o awk :

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

ou de acordo com Stéphane Chazelas 'comentário

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

Use isto:

awk -v alt="$ALTER" -v name="$NAME" '
   $2 ~ /-/ && $2 >= alt && $3 ~ name{print $1}' file
  • $2 ~ /-/ : verifica se o número de dias está incluído.
  • $2 >= alt : verifica se o número de dias em etime é maior que $ALTER .
  • $3 ~ name : pesquisa o valor de name ( $NAME ) no terceiro campo.

Outra solução bash pura:

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 n armazena o pid, o etime e o nome do comando nas variáveis $p , $e e $n .
    • [[ $n =~ $NAME ]] : verifica se o comando tem $NAME
    • [[ $e =~ \- ]] : verifica se o etime tem um traço (-) nele (significa que o processo é executado mais de um dia)
    • [ "${e%%-*}" -ge "$ALTER" ] : verifica se o contador diário de etime é maior ou igual ao valor em $ALTER
  • Se todos os itens acima forem atendidos, imprima o pid: echo $p
por 07.10.2015 / 10:32