将变量传递给使用awk的函数

时间:2017-11-07 15:56:27

标签: function variables awk parameter-passing aix

我有一个脚本尝试按名称停止某个进程(但是我需要指定一个不能被杀死的字符串,即“notThisProcess”),如果它还没有来,则在20秒后杀掉它优雅地说,即:

#!/bin/ksh
bname=BTEST
bserver=BSERVER

PROCESS_ID=`ps auxww | awk '/PROCESS_NAME_ALPHA/ && !/awk/ && !/notThisProcess/ {print $2}'`
/apps/customapp/stopcommand -a $bname -processName PROCESS_NAME_ALPHA -serverName $bserver
sleep 20
kill -4 $PROCESS_ID

PROCESS_ID2=`ps auxww | awk '/PROCESS_NAME_BETA/ && !/awk/ && !/notThisProcess/ {print $2}'`
/apps/customapp/stopcommand -a $bname -processName PROCESS_NAME_BETA -serverName $bserver
sleep 20
kill -4 $PROCESS_ID2

#etc..

由于我的进程列表刚刚增加,我试图将这些步骤放入函数中,但我无法弄清楚如何将进程名称传递给awk。即,这不起作用:

#!/bin/ksh
bname=BTEST
bserver=BSERVER

cycleProcess()
{
PROCESS_ID=`ps auxww | awk '/$1/ && !/awk/ && !/notThisProcess/ {print $2}'`
/apps/customapp/stopcommand -a $bname -processName PROCESS_NAME_ALPHA -serverName $bserver
sleep 20
kill -4 $PROCESS_ID
}

cycleProcess PROCESS_NAME_ALPHA
cycleProcess PROCESS_NAME_BETA

exit

我已经看过几次通过-v引用赋值,但尽管经过多次尝试但我还没有成功。有什么建议吗?

3 个答案:

答案 0 :(得分:0)

您可以在管道字符分隔列表中传递它们,并与最后一个字段进行比较。

ps ... | awk -v keep="process1|process2|process3"  '$NF!~keep{print $2}'

另请注意,在您的脚本awk '/$1/ && ...中,变量不是bash变量,而是传递给awk脚本的第一个字段。

答案 1 :(得分:0)

我这样写:

#!/bin/ksh
bname=BTEST
bserver=BSERVER

cycleProcess() {
    typeset procname="$1"
    typeset pid=$(ps auxww | awk -v name="$procname" '$0 ~ name && !/awk/ && !/notThisProcess/ {print $2}')
    if [[ -z "$pid" ]]; then
        echo "$procname is not running"
        return
    fi
    /apps/customapp/stopcommand -a "$bname" -processName "$procname" -serverName "$bserver"
    sleep 20
    kill -4 "$pid"
}

processes=(
    PROCESS_NAME_ALPHA
    PROCESS_NAME_BETA
)

for proc in "${processes[@]}"; do 
    cycleProcess "$proc"
done
函数中的

typeset是一种将变量声明为该函数的本地变量的方法。

我无法访问AIX框。我的Linux框上的ps auxww输出显示字段11中的命令名称,因此您可以使用/name/ && !/awk/ && !/thisScript/而不是$11 == name {print $2},  如果匹配不准确,则为$11 ~ name

答案 2 :(得分:0)

正如其他人已经指出的那样,可以使用 -v 选项将shell变量传递给awk脚本。如果awk脚本位于单独的文件中(使用 -f 选项),则必须使用此选项。

在shell脚本中直接在单引号(' ...')之间指定awk脚本时,您也可以使用构造' " $ shell_variable " ' 即可。请注意,这样做时,单引号和双引号之间必须没有空格!

示例:

process_string="plugin-container"

pids=$( ps -fu $LOGNAME | awk '/'"$process_string"'/ { print $2 }' )