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