如何通过Shell命令按条件提取包含//的目标子字符串?
解决方法:提取包含//的目标子串
没问题!我来帮你调整正则或者换用其他工具,轻松拿到你想要的//hostname/path/结果。
方法一:修改grep的Perl正则(最简单直接)
你之前的正则是用正向预查只匹配了/之后的内容,现在我们直接匹配以//开头、直到第一个空格为止的整个串就行:
cat myfile | grep " cifs " | grep -oP '//[^\s]+'
正则解释:
//:直接匹配开头的两个斜杠,确保包含目标前缀[^\s]+:匹配所有非空格字符(直到遇到第一个空格停止),正好覆盖你要的路径部分
方法二:用awk处理字段
如果习惯用awk,也可以通过遍历字段的方式提取:
awk '/ cifs / {for(i=1;i<=NF;i++) if($i ~ /^\/\//) print $i}' myfile
逻辑说明:
- 先筛选出包含
cifs的行 - 遍历该行的每个字段(默认以空格分隔)
- 找到以
//开头的字段,直接打印
方法三:用sed做字符串替换
sed也能通过捕获组实现提取:
sed -n '/ cifs /s/.*\(\/\/[^ ]*\).*/\1/p' myfile
逻辑说明:
/ cifs /:只处理包含该字符串的行s/.*\(\/\/[^ ]*\).*/\1/:捕获//到第一个空格前的内容,用捕获的内容替换整行-n和p:只打印处理后的行
这样不管//hostname/path/在哪个位置,都能准确提取出包含//的完整子串啦~
内容的提问来源于stack exchange,提问作者Vijesh
相关产品推荐
相关产品推荐

