Linux/Bash If条件等于包含单引号的字符串

Linux/Bash If条件等于包含单引号的字符串,bash,if-statement,split,Bash,If Statement,Split,关于下面的命令,我尝试将日志文件中以空格分隔的内容插入一个数组(arr),然后设置一个条件,从中查找并提取一个特定的字符串。 问题是主题字符串被单个引号包围,我不知道在条件语句中包含这些引号的正确语法是什么: cat file.log | nawk '{split($0,arr," "); for (i=1;i<=NF;i++) if (arr[i]=='serviceid') printf ("%s,%s\n",arr[i],arr[i+1])}'

关于下面的命令,我尝试将日志文件中以空格分隔的内容插入一个数组(arr),然后设置一个条件,从中查找并提取一个特定的字符串。 问题是主题字符串被单个引号包围,我不知道在条件语句中包含这些引号的正确语法是什么:

cat file.log | nawk '{split($0,arr," "); for (i=1;i<=NF;i++) if (arr[i]=='serviceid') printf ("%s,%s\n",arr[i],arr[i+1])}'

只需使用包含所需值的变量:

awk -v str="'serviceid'" … …
这将避免在脚本中进行复杂的引用。
整个awk脚本都包含单引号,这使得单引号的使用变得困难

另外,您发布的日志文件示例中有一个字段,其结尾为冒号
“serviceid”:
。如果字段在空白处拆分。
您可以将其附加到上面定义的变量,或者使用
~
(匹配)运算符而不是
==
(相等)运算符。该运算符(
~
)将匹配包含
'serviceid'
的任何字段

像这样:

nawk -vstr="'serviceid'" '
    $0~str{
        split($0,arr," "); 
        for (i=1;i<=NF;i++) 
            if (arr[i]~str) 
                printf ("%s,%s\n",arr[i],arr[i+1])
    }' file.log

如果您能提供一个日志文件的简短示例,这样我们就可以测试代码了,那就太好了。谢谢,请在需要报价的地方使用\047。通常在BEGIN中将其分配给var,然后使用:)@aschkant如果答案有助于解决您的问题,通常会“接受”答案。亲爱的@sorontar,请阅读完毕^^
awk -v str="'serviceid'" … …
nawk -vstr="'serviceid'" '
    $0~str{
        split($0,arr," "); 
        for (i=1;i<=NF;i++) 
            if (arr[i]~str) 
                printf ("%s,%s\n",arr[i],arr[i+1])
    }' file.log
nawk -vstr="'serviceid'" '$0~str{ split($0,arr," "); for (i=1;i<=NF;i++) if (arr[i]~str) printf ("%s,%s\n",arr[i],arr[i+1]) }' infile