我正在使用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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。