模式文件:
wicked liquid
movie
guitar
balance transfer offer
drive car
bigfile文件:
wickedliquidbrains
drivelicense
balanceofferings
在命令行上使用awk:
awk '/balance/ && /offer/' bigfile
我得到了我想要的结果
balanceofferings
awk '/wicked/ && /liquid/' bigfile
给了我
wickedliquidbrains, which is also good..
awk '/drive/ && /car/' bigfile
不给我drivelicense也很好,因为我有&&
现在尝试传递shell变量时,包含'/ regex1 /&& / regex2 / ..等'到awk ..
awk -v search="$out" '$0 ~ search' "$bigfile"
awk没有运行..可能是什么问题??
答案 0 :(得分:2)
试试这个:
awk "$out" "$bigfile"
执行$0 ~ search
时,search
的值必须是正则表达式。但是你将它设置为一个字符串,其中包含一堆在它们之间带有&&
的正则表达式 - 这不是一个有效的正则表达式。
要对匹配的行执行操作,请执行:
awk "$out"' { /* do stuff */ }' "$bigfile"
如果操作使用带有$
的awk变量,我会从双引号切换到单引号。
答案 1 :(得分:1)
<强>已更新强>
使用-v
传递参数的Barmars解决方案的替代方案:
awk -v search="$out" 'match($0,search)' "$bigfile"
测试:
$ echo -e "one\ntwo"|awk -v luk=one 'match($0,luk)'
one
将两个(真实)正则表达式(ERE)传递给awk:
echo -e "one\ntwo\nnone"|awk -v re1=^o -v re2=e$ 'match($0,re1) && match($0,re2)'
输出:
one
如果你想读取pattern_file并匹配所有行,你可以尝试这样的事情:
awk 'NR==FNR{N=NR;re[N,0]=split($0,a);for(i in a)re[N,i]=a[i];next}
{
for(i=1;i<=N;++i) {
#for(j=1;j<=re[i,0]&&match($0,re[i,j]);++j);
for(j=1;j<=re[i,0]&&$0~re[i,j];++j);
if(j>re[i,0]){print;break}
}
}' patterns_file bigfile
输出:
wickedliquidbrains
在第1行,它读取并将pattern_file存储在2D数组re
中。每行包含拆分输入字符串。每行的第0个元素是该行的长度。
然后它会显示bigfile
。测试bigfile
的每一行是否匹配re
数组。如果一行中的所有项目都匹配,则打印该行。