如何用grep命令从vehicles.txt中筛选同时满足三条件的车辆信息
筛选同时满足多条件的车辆信息块
你的问题在于grep的-e选项是逻辑或关系,只要满足任一条件就会输出。要筛选同时满足三个条件的车辆块(每条车辆是一组多行信息),可以用以下两种方法:
方法1:用grep实现逻辑与匹配
如果你的vehicles.txt中每个车辆信息块之间用空行分隔,可以用grep的-z选项将每个块视为一个独立记录,再结合正向预查确保三个条件都存在:
# 忽略大小写版本 grep -z -i -E '(?=.*License Plate: L337)(?=.*Make : Honda)(?=.*Color: Blue)' vehicles.txt | tr '\0' '\n' # 区分大小写版本 grep -z -E '(?=.*License Plate: L337)(?=.*Make : Honda)(?=.*Color: Blue)' vehicles.txt | tr '\0' '\n'
-z:把文件内容按空行分割成独立记录,确保每个车辆块被当作整体处理-E:启用扩展正则表达式,支持正向预查语法(?=.*条件):正向预查,确保当前记录包含指定条件,多个预查组合就是逻辑与关系tr '\0' '\n':把grep -z用的null分隔符转回换行符,恢复正常格式
方法2:用awk处理更灵活
如果车辆块的分隔规则不固定(比如没有空行,固定4行一个块),awk的自定义记录处理更可靠:
情况1:车辆块用空行分隔
# 忽略大小写 awk ' BEGIN { RS = ""; IGNORECASE = 1 } /License Plate: L337/ && /Make : Honda/ && /Color: Blue/ { print $0 "\n" } ' vehicles.txt # 区分大小写 awk ' BEGIN { RS = "" } /License Plate: L337/ && /Make : Honda/ && /Color: Blue/ { print $0 "\n" } ' vehicles.txt
RS = "":设置空行为记录分隔符IGNORECASE = 1:开启忽略大小写匹配- 逻辑与运算符
&&确保三个条件同时满足
情况2:固定4行一个车辆块
如果文件里没有空行分隔,每4行对应一辆车的信息:
awk ' { line = line $0 "\n" # 每收集4行就检查一次 if (NR % 4 == 0) { if (line ~ /License Plate: L337/ && line ~ /Make : Honda/ && line ~ /Color: Blue/) { print line } line = "" # 重置内容,准备收集下一个块 } } ' vehicles.txt
内容的提问来源于stack exchange,提问作者Erdem_Ayhan
相关产品推荐
相关产品推荐

