如何从applications.txt文件提取两个搜索模式间的字符串(含模式)
嗨,我来帮你搞定这个文本提取的问题!从你的描述和示例来看,你需要从applications.txt里揪出那些以x01g开头的主机名——这些主机名刚好被夹在连字符之间。下面我给你几种常用的命令行工具方案,都是Linux/Unix环境下的实用工具:
使用grep快速提取
grep是处理文本匹配的利器,用它可以直接只输出你要的内容:
grep -o 'x01g[^-]*' applications.txt
解释一下:
-o参数让grep只输出匹配到的部分,而不是整行内容;x01g[^-]*是正则表达式:x01g匹配开头,[^-]*表示匹配任意个不是连字符的字符,刚好能精准截取到主机名的结尾(因为后面跟着的就是连字符啦)。
使用sed替换提取
sed擅长文本替换,我们可以把整行里不需要的内容都替换掉,只留下目标主机名:
sed 's/.*-\(x01g[^-]*\)-.*/\1/g' applications.txt
解释:
.*-\(x01g[^-]*\)-.*匹配整行内容,其中\(x01g[^-]*\)是我们要保留的部分(用括号捕获成分组);\1表示引用第一个捕获的分组,用它来替换整行,就只剩下我们要的主机名了;g表示全局替换,不过这里每行只有一个目标,加不加都可以,但加上更稳妥。
使用awk按字段提取
awk可以把每行按分隔符拆成字段,然后我们找符合条件的字段就行:
awk -F '-' '{for(i=1;i<=NF;i++) if($i ~ /^x01g/) print $i}' applications.txt
解释:
-F '-'指定用连字符作为字段分隔符,把每行拆成一个个小字段;- 循环遍历每个字段,如果字段以
x01g开头(/^x01g/),就打印这个字段。
额外需求:区分UAT/PROD环境
如果你还想同时知道每个主机名属于哪个环境(UAT或PROD),可以用awk扩展一下:
awk -F '-' '{for(i=1;i<=NF;i++) if($i ~ /^x01g/) {for(j=i+1;j<=NF;j++) if($j ~ /UAT|PROD/) print $i, "(" $j ")"}}' applications.txt
这个命令会输出类似x01gmobdb2a (PRD)这样的结果,清晰对应主机名和环境。
内容的提问来源于stack exchange,提问作者Adireddy
相关产品推荐
相关产品推荐

