Linux Bash和awk-在进行多行模式数学时,如何将变量传递给awk?

Linux Bash和awk-在进行多行模式数学时,如何将变量传递给awk?,linux,bash,awk,gawk,Linux,Bash,Awk,Gawk,我正在使用AWK与模式进行多行匹配。 例如: awk '/"ip": /,/"id": /' 当我知道ip时,我想向AWK传递一个参数,以便它返回包含指定ip的行。例如: awk '/"ip": "$IP"/,/"id": /' 有什么办法呢 我试过: awk '/"ip": "$IP"/,/"id": /' awk '/"ip": "${IP}"/,/"id": /' awk "/\"ip\": \"$IP\"/,/\"id'\": /" 我想知道如何将这种方法用于模式: var="he

我正在使用
AWK
与模式进行多行匹配。 例如:

awk '/"ip": /,/"id": /'
当我知道
ip
时,我想向AWK传递一个参数,以便它返回包含指定ip的行。例如:

awk '/"ip": "$IP"/,/"id": /'
有什么办法呢

我试过:

awk '/"ip": "$IP"/,/"id": /'
awk '/"ip": "${IP}"/,/"id": /'
awk "/\"ip\": \"$IP\"/,/\"id'\": /"
我想知道如何将这种方法用于模式:

var="hello"; awk -v a="$var"
谢谢


回答

  • 已接受,可在下面找到
  • 任何对如何使匹配更精确感兴趣的人(使用变量+字符串模式)的其他详细信息。请注意,您不能用双引号将模式中使用的变量包装起来,即使引号被转义,它也不起作用:

    cat l.txt | awk '$0 ~ "\"ip\": \"103.6.181.43", $0 ~ "\"id\": \""'              ===> works
    cat l.txt | awk -v ipvar=103.6.181.43 '$0 ~ ipvar, $0 ~ "\"id\": \""'           ===> works
    cat l.txt | awk -v ipvar=103.6.181.43 '$0 ~ "\"ip\": \"ipvar", $0 ~ "\"id\": \""' ===> does not work
    cat l.txt | awk -v ipvar=103.6.181.43 '$0 ~ "\"ip\": \""ipvar, $0 ~ "\"id\": \""' ===> works
    
最后,您可以环绕qoutes中使用的参数。比较:

awk -v ipvar=103.6.181.43 '$0 ~ "\"ip\": \"ipvar\"", $0 ~ "\"id\": \""'  ===> will not work
awk -v ipvar=103.6.181.43 '$0 ~ "\"ip\": \""ipvar"\"", $0 ~ "\"id\": \""' ===> will work and is equivalent.

您试图在单引号内展开一个变量。单引号(')使它们之间的所有内容都被bash按字面意思理解。尝试使用双引号,请参见

关于你关于
awk
作业的问题,这里有一个例子:


awk-v foo=“bar”'foo~$0'不要在
/
中添加变量,因为那里有一个正则表达式

相反,一定要使用
$0~模式
,这会给你更多的自由。毕竟,

/pattern1/,/pattern2

$0 ~ pattern1, $0 ~ pattern2
因此,您可以使用
-v
提供值并说:

awk -v var="$bash_variable" '$0~"ip: " var,$0 ~ "id: " var'
#                            ^^^^^^^^^^^^^
#                                          ^^^^^^^^^^^^^^^
#                               start           end
试验
我已经尝试过双qoutes——它在示例中。另外,我不明白赋值示例是如何使用模式的——我仍然希望以某种方式保留多行匹配:)您是否试图匹配由双引号排序的
IP
?是的,数据示例如下所示
“IP”:“127.0.0.1”,
。。然后是几行(行数未知,所以我需要模式),然后是
“id”:“123”,我明白了。查看@fedorqui答案。它比我的好。请添加示例输入和预期输出。谢谢,我还会在OP中添加更多的点,以供任何迷路或偶然发现以下问题的人参考:)@MindaugasBernatavičius很高兴阅读它对您有用。我的回答很简单。我想你的最终解决方案是有点麻烦,因为所有这些双引号需要转义。好在你把最终版本展示给未来的读者!
$ cat a
hello
ip: 23
bye
and this is
id: 23
hehe
done
$ awk -v var=23 '$0~"ip: " var,/id: /' a
ip: 23
bye
and this is
id: 23