如何基于多个逻辑与的匹配规则筛选符合条件的文件
双模式逻辑与文件筛选解决方法
错误原因说明
- 你写的
*peanut* *1*语法错误:shell会将空格分隔的两个通配符识别为独立的匹配规则,最终匹配到的是「含peanut的所有文件」加「含1的所有文件」,不是同时满足两个条件的结果。 - 你之前运行awk报错的原因:将awk命令直接拼接在文件路径后,shell会把
awk识别为路径下的文件名,自然会触发找不到文件的错误,awk需要通过管道符接收前面的命令输出才能正常工作。
解决方法
方法1:直接用通配符匹配(最贴合你复用单模式匹配的需求)
如果两个关键词的出现顺序固定(你的示例里都是peanut在前、1在后),直接把两个关键词串在通配符里即可:
ls /data/peanut_dir/yum/*peanut*1*
如果不确定两个关键词的先后顺序,可以开启shell的扩展通配符功能后用如下写法(bash默认支持):
shopt -s extglob ls /data/peanut_dir/yum/*(peanut*1|1*peanut)*
方法2:多管道grep筛选(新手最易理解、灵活度最高)
每加一个grep就对应一个需要同时满足的过滤条件,逻辑清晰:
ls /data/peanut_dir/yum/ | grep "peanut" | grep "1"
方法3:正确使用awk筛选
用管道符|把ls的输出传递给awk命令即可解决之前的报错:
ls /data/peanut_dir/yum/ | awk '/peanut/ && /1/'
以上三种方法基于你的示例文件,都会正确输出两个符合要求的文件:
peanut_butter_1.txt peanuts_1.txt
内容的提问来源于stack exchange,提问作者JVDeasyas123
相关产品推荐
相关产品推荐

