bash – 从shell脚本中的pargs解析进程命令行参数

我在我的bash脚本(Java进程)中得到PID列表,并且必须分析它们的命令行参数以确定每个PID对应的服务器实例.

目前我使用sed / cut这样做:

  PARGS=$(pargs -l $PID)
  PARGS_ARR=($PARGS)
  NODE='UNKNOWN'
  for ARG in ${PARGS_ARR[@]}
  do
    # trim single quotes 
    ARG=$(echo $ARG | sed "s/'//g")

    # split by equals sign
    ARGL=$(echo $ARG | cut -f1 -d=)
    ARGR=$(echo $ARG | cut -f2 -d=)

    if [ "$ARGL" == "-DnodeId" ]; then
      NODE=$ARGR
    fi
  done

但由于大量的命令行参数(每个PID大约20-30个),它的工作速度非常低.

有没有办法以某种方式解析命令行参数并使用单个命令获取key =>值解析?

最佳答案
pargs -l $PID的输出是什么样的?从您的代码中,它似乎是一行包含格式的所有命令行参数,例如:

arg1=val1 arg2=val2

如果是这样,您可以使用sed命令收集-DnodeId参数的值:

$ARGS="-DfirstArg=foo -DanotherArg=bar -DnodeId=1234 -DlastArg=baz"
$echo "$ARGS" | sed -r 's/.*-DnodeId=([^ ]+).*/\1/g'
1234

所以你的脚本可能变成:

PARGS=$(pargs -l $PID)
NODE='UNKNOWN'
if [ -n "$(grep "DnodeId" <(echo "$PARGS"))" ]; then
    NODE=$(echo "$PARGS" | sed -r 's/.*-DnodeId=([^ ]+).*/\1/g')
fi

转载注明原文:bash – 从shell脚本中的pargs解析进程命令行参数 - 代码日志