关于使用grep匹配服务列表与/tmp/file正则规则的技术问询
需求与问题
我有一份名为list_services的服务列表,内容如下:
user@10006 user@10007 user@10008 user@10009 user@1006 user@509 user@512 user@513 user@519
我想通过以下循环,让列表中的每个服务条目匹配/tmp/file里预先设置的正则表达式内容:
for service in $list_services : grep $service /tmp/file
我已经尝试过两种方式,但都没成功匹配:
- 使用
grep "^$service$" /tmp/file,同时在/tmp/file中写入user@.、user@\d和user@*; - 使用
grep "$service" /tmp/file,/tmp/file里的内容和上面一致。
解决方法
你的问题核心是正则匹配方向搞反,加上grep用法、正则语法和循环逻辑的小问题,以下是具体修正方案:
1. 逻辑纠正
你现在是用列表里的具体服务(比如user@10006)去匹配/tmp/file里的正则,这完全搞反了——应该用/tmp/file里的正则规则,去匹配列表中的服务条目。
2. 正确的脚本写法
场景一:list_services是文件(每行一个条目)
while IFS= read -r service; do # 用/tmp/file里的正则匹配当前服务条目 grep -qxFf /tmp/file <<< "$service" && echo "$service 匹配成功" || echo "$service 不匹配" done < list_services
场景二:list_services是环境变量(换行分隔)
echo "$list_services" | while IFS= read -r service; do grep -qxFf /tmp/file <<< "$service" && echo "$service 匹配成功" || echo "$service 不匹配" done
参数说明:
-f /tmp/file:从文件读取正则作为匹配规则-x:强制整行匹配(等价于手动加^和$)-F:如果你的规则是固定字符串而非正则,加这个参数关闭正则解析;如果是正则就去掉-F-q:静默模式,只返回匹配结果的退出码,不输出冗余内容
3. 修正/tmp/file里的正则语法
你之前写的正则存在语法错误,针对你的服务格式,推荐把/tmp/file内容改成:
user@[0-9]+
对应解释:
- 原来的
user@.:仅匹配user@加1个任意字符,不符合多位数字的场景 - 原来的
user@\d:Grep默认用基础正则,\d不生效,要改成[0-9];如果用扩展正则(加-E参数)才能用\d - 原来的
user@*:正则里*是匹配前面字符0次或多次,这里会变成匹配user加0个或多个@,完全不符合需求
如果要用扩展正则写法,/tmp/file也可以写成:
user@\d+
脚本里的grep要加-E参数:
grep -qxEf /tmp/file <<< "$service"
4. 原循环的坑点
你原来的for service in $list_services会把所有条目按空格分割,而不是换行——如果list_services里的条目是换行分隔的,会被拆成零散单词,导致循环逻辑彻底错误。必须用while read来逐行读取内容。
内容的提问来源于stack exchange,提问作者Frilowe
相关产品推荐
相关产品推荐

