编辑: 添加解决方案,该解决方案也将处理剩余空间。完全基于仅显示的样本。还有一件事,这个解决方案只会在 ips 和 mac 地址之后打印带有管道的行,如果两者都匹配,否则它只会打印该行。
awk --re-interval '
{
$1=$1
}
match($0,/([0-9]+\.){3}[0-9]+ /){
val=substr($0,RSTART,RLENGTH-1)"|"
$0=substr($0,RSTART+RLENGTH)
}
match($0,/([[:xdigit:]]+:){5}[[:xdigit:]]+ /){
print val substr($0,RSTART,RLENGTH-1)"|" substr($0,RSTART+RLENGTH)
next
}
1
' Input_file
您能否尝试以下操作(仅使用提供的示例进行测试,使用 GNU awk,我们也可以缩短它,但由于我有旧版本的 awk,我稍后会尝试添加它)。
awk '{sub(/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/,"&|");sub(/[[:xdigit:]]+:[[:xdigit:]]+:[[:xdigit:]]+:[[:xdigit:]]+:[[:xdigit:]]+:[[:xdigit:]]+/,"&|")} 1' Input_file
或以上代码的正则表达式也可以缩短为如下。
awk --re-interval '{sub(/([0-9]+\.){3}[0-9]+/,"&|");sub(/([[:xdigit:]]+:){5}[[:xdigit:]]+/,"&|")} 1' Input_file
或者使用 gsub 并在单个 gsub 本身中提及正则表达式。
awk --re-interval '{gsub(/([0-9]+\.){3}[0-9]+|([[:xdigit:]]+:){5}[[:xdigit:]]+/,"&|")} 1' Input_file
如果您想将输出保存到 Input_file 本身,那么也将> temp_file && mv temp_file Input_file 附加到上面的代码中。
sed 解决方案: 使用 GNU sed 测试。
sed -E 's/([0-9]+\.){3}[0-9]+|([[:xdigit:]]+:){5}[[:xdigit:]]+/&|/g' Input_file
注意:我正在使用--re-interval,因为它很旧,否则你可以删除它,如果你有最新版本的awk 与你(GNU awk )