使用tr与awk提取文本内容仅得第一组数据,如何获取全部结果?
提取多组URL对应IP、邮箱和手机号的解决方案
需求场景
你有一个包含多组数据的文本文件,格式如下:
URL: http://123.123.123.123 file: php 124.124.124.124|user1|email|phone URL: http://1.2.3.4 file: php 2.1.3.1|userx|emailx|phonex
需要提取每组中URL对应的IP、数据行里的邮箱和手机号,输出格式为 IP:邮箱:手机号。
原命令问题分析
你原本使用的命令:
grep http -A 3|tr '\n' ' '|tr '|' ' '|awk '{print $2,$7,$8}'|tr ' ' ':'
问题在于tr '\n' ' '把所有行的内容合并成了一整行,awk仅处理这一行,只能输出第一组的结果。
推荐解决方案:用awk直接处理文件
awk可以直接遍历整个文件,分别捕获URL的IP和数据行的目标字段,匹配到数据行时直接输出组合结果,更高效准确:
awk ' /URL:/ { # 从http://后提取IP,跳过前8个字符("http://"长度) ip = substr($2, 8) } /|/ { # 按|分割数据行,取第3个(邮箱)和第4个(手机号)字段 split($0, parts, "|") print ip ":" parts[3] ":" parts[4] }' 你的文件名.txt
管道链调整方案(仅作参考)
如果坚持用管道组合命令,需要避免合并所有行,而是将每组的URL行和数据行配对处理:
grep -E "URL:|.*\|.*\|.*\|.*" 你的文件名.txt | paste - - | awk '{ split($1, url_parts, "://"); ip = url_parts[2] split($2, data_parts, "|") print ip ":" data_parts[3] ":" data_parts[4] }'
这里grep筛选出URL行和数据行,paste - -把相邻的URL行和数据行合并为一行,再用awk分割提取所需内容。
内容的提问来源于stack exchange,提问作者Testdev01
相关产品推荐
相关产品推荐

