如何在 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

没有必要使用awk:

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 n将 pid、etime 和命令名称存储在变量$p$e和中$n
    • [[ $n =~ $NAME ]]:检查命令$NAME中是否有
    • [[ $e =~ \- ]]:检查 etime 中是否有破折号 (-)(表示该进程运行超过一天)
    • [ "${e%%-*}" -ge "$ALTER" ]:检查 etime 的日计数器是否大于或等于中的值$ALTER
  • 如果满足以上所有条件,则打印 pid:echo $p

相关内容