Shell 在脚本中的Awk命令中使用变量

Shell 在脚本中的Awk命令中使用变量,shell,awk,ksh,Shell,Awk,Ksh,我在使用变量和使用awk命令打印第二个字段时遇到了一些问题。我试图从文件中的值中获取一个数字。文件中的值如下所示 MAX=10000(我只想要这个数字),我将它传递到脚本中的一个变量中,因此在脚本中我有变量 parm_file=ParmFiles/Parmfile.parm session=s_session_value OLD_MAX_SEQ_NR=`awk -F '=' "/$session/ {getline; print $2}" < $parm_file` parm_fil

我在使用变量和使用awk命令打印第二个字段时遇到了一些问题。我试图从文件中的值中获取一个数字。文件中的值如下所示

MAX=10000(我只想要这个数字),我将它传递到脚本中的一个变量中,因此在脚本中我有变量

parm_file=ParmFiles/Parmfile.parm
session=s_session_value

OLD_MAX_SEQ_NR=`awk -F '=' "/$session/ {getline; print $2}" < $parm_file` 
parm_file=ParmFiles/Parmfile.parm
session=s_session_值
OLD_MAX_SEQ_NR=`awk-F'='“/$session/{getline;print$2}”<$parm_file`
因为我有双引号来标识$session变量,它也将$2作为变量,所以它只是打印整行,而不是第二个字段

我还尝试将变量传递到awk命令中,如

OLD_MAX_SEQ_NR=`awk -F '=' \
    -v var="$session" \
    '/var/ {getline; print $2}' < $parm_file`
OLD_MAX_SEQ_NR=`awk-F'='\
-v var=“$session”\
“/var/{getline;print$2}”<$parm_文件`
但它似乎没有把变量放在
var
所在的位置。我甚至尝试过对
-v var=“s\u session\u value”
进行编码,但它不起作用


我想不出一种方法来让命令像通常那样查看
$2
,而不是变量。任何帮助都将不胜感激。

如果没有parm文件的示例行,这有点棘手。但是我不明白你为什么不使用
cut
,这会让它更简单吗

OLD_MAX_SEQ_NR=$(grep "$session" "$parm_file" | cut -d= -f2)
试试这个:

parm_file=ParmFiles/Parmfile.parm
session=s_session_value

OLD_MAX_SEQ_NR=$(
    awk -F'=' -v pat="$session" \
        '$0 ~ pat {getline; print $2}' < "$parm_file"
) 
parm_file=ParmFiles/Parmfile.parm
session=s_session_值
旧的最大值顺序编号=$(
awk-F'='-v pat=“$session”\
“$0~pat{getline;print$2}”<“$parm_文件”
) 
  • 您需要通过使用
    -v
    定义awk变量,将shell变量传递给
    awk
  • /../
    中使用变量被视为文本。因此,使用
    $0~var\u name
    构造
  • 不推荐使用反勾号。使用命令替换
    $(..)
  • 引用你的变量
awk不是外壳,就像C不是外壳一样。awk有变量,shell也有变量,但你不能像不能在C中访问shell变量一样直接访问awk中的shell变量。发布一些示例输入和预期输出,因为你希望得到错误的建议,因为你已经发布了。确保你阅读了所有的优点和缺点!!!parm文件类似于[s_session_value]$$MAX_SEQ=234566[s_session_value2]$$MAX_SEQ=2345432您的解决方案非常有效!当我使用-v时,我确信我试图引入错误的变量。谢谢你澄清。另外,后面的记号来自于使用的其他代码,所以我只是按照使用的代码。你能解释一下为什么现在贬值吗?谢谢你的解决方案@不客气。你可以阅读详细的解释。@783不客气。很高兴我能帮忙<代码>:)