系统相关
首页 > 系统相关> > Linux-Bash和AWK-在执行多行模式数学时如何将变量传递给AWK?

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

作者:互联网

我正在使用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.

解决方法:

不要在/ /内添加变量,因为那里有一个正则表达式.

相反,请使用$0〜模式,这将为您提供更多的自由.毕竟,

/pattern1/,/pattern2

是相同的

$0 ~ pattern1, $0 ~ pattern2

因此,您可以使用-v提供值并说:

awk -v var="$bash_variable" '$0~"ip: " var,$0 ~ "id: " var'
#                            ^^^^^^^^^^^^^
#                                          ^^^^^^^^^^^^^^^
#                               start           end

测试

$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

标签:gawk,bash,awk,linux
来源: https://codeday.me/bug/20191118/2030917.html