我有一个csv文件,我想查找包含“ABC”,“12”和“45”的行。但我不想在前五栏中查看“ABC”。所以我写了这个正则表达式:
(.*?,)(.*?,)(.*?,)(.*?,)(.*?,).*,ABC,.*,12,.*,45,.*
但是当我做的时候
grep '(.*?,)(.*?,)(.*?,)(.*?,)(.*?,).*,ABC,.*,12,.*,45,.*' in.csv| wc -l
我的行数为零。
但如果我不忽略前五列并且
grep '.*,ABC,.*,12,.*,45,.*' in.csv| wc -l
然后我得到4962行。
但实际上它们在csv中的行数较少,可以满足这一要求。所以在第一个正则表达式中缺少什么。
输入:
306702,00848719009996,NULL,B,ABC,199.00,189.05,311,XYZ,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,9SIA3G62HJ3818,12,45
不匹配
306702,00848719009996,NULL,B,ABC,199.00,189.05,311,ABC,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,9SIA3G62HJ3818,12,45
应匹配
答案 0 :(得分:0)
使用tail和pipe输出到grep可以做到,
tail -n +5 in.csv|grep 'ABC'|grep '12'|grep '45'
这里+5表示5之后的所有行
如果匹配顺序很重要,您可以尝试:
tail -n +5 in.csv|grep -E 'ABC.*12.*45'
如果你想匹配任何一个匹配grep OR可以做魔术
grep 'ABC\|12\|45'
答案 1 :(得分:0)
Grep跳过第一列和第二列
grep "xxx" file.log | awk '{$1="";$2="";print}'