我的文件有千位数据,例如括号内的IP地址以及逗号和连字符。在哪里我会删除所有替换IP地址替换IP地址出现在没有空行或空格的换行符..
下面是一个示例文件..
Patch
我现在的解决方案如下,但它可以更好或以更好的控制方式简化
$ cat file1
mynetgroup-test (192.19.23.57,-,) (192.19.23.58,-,)
答案 0 :(得分:2)
使用grep
怎么样?
$ egrep -o '[a-z][a-z-]+|[0-9]+(\.[0-9]+){3}' input.txt
mynetgroup-test
192.19.23.57
192.19.23.58
或者当然grep -E
如果您的操作系统不想使用egrep
。
此解决方案仅匹配看起来像主机名和IP地址的模式,并且(感谢grep的-o
选项)按照它们被看到的顺序仅打印匹配的部分。
备用表示法可能是使用grep
的{{1}}选项来包含多个正则表达式:
-e
当然,如果确实想要使用其他工具,以下内容可能会有效:
egrep -o -e '[a-z][a-z-]+' -e '[0-9]+(\.[0-9]+){3}' input.txt
这将打印第一个字段,然后逐步删除其他字段,删除不需要的字符,然后打印字段。
另一个替代方案可能就是:
$ awk '{print $1; for(i=2;i<=NF;i++) { gsub(/[^0-9.]/,"",$i); print $i } }' input.txt
mynetgroup-test
192.19.23.57
192.19.23.58
这会执行相同的单步执行字段,然后使用脚本末尾的$ awk '{for(i=2;i<=NF;i++) { gsub(/[^0-9.]/,"",$i) } } 1' OFS="\n" input.txt
简写打印整个记录。 OFS变量赋值与1
选项略有不同,但在这种情况下的工作方式相同。
如果你不介意管道,你可以用sed做这样的事情:
-v
这将单词分隔成单独的行,以便于sed处理(以及模拟最终的输出格式)。 sed脚本然后(1)打印任何以字母开头的行,假设它是一个主机名,然后tr ' ' '\n' < input.txt | sed -ne '/^[a-z]/{p;b' -e '}' -e 's/[^0-9.]//gp'
牧场将我们带到下一行,(2)从任何字符中删除任何非IP地址字符其他行,并打印出来。
这里的sed符号是用bsd sed测试的,但是也可以和GNU sed一起使用。
答案 1 :(得分:2)
使用GNU awk进行多字符RS:
$ awk -v RS='\\s+' '{gsub(/[-,)(]/,"")}1' file
mynetgrouptest
192.19.23.57
192.19.23.58
答案 2 :(得分:1)
如果您只需要地址,那么以下内容可能对您有帮助。
awk '{while(match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/)){print substr($0,RSTART,RLENGTH);$0=substr($0,RSTART+RLENGTH+1)}}' Input_file
EDIT1: 如果您的Input_file与显示的示例100%相同,那么以下内容也可以帮助您。
awk -v RS=" " '{gsub(/\(|,|-|\)/,"");gsub(/$\n$/,"")} 1' Input_file
EDIT2: 从Ghoti先生的解决方案中获取一点正则表达式的灵感。
awk -v RS=" " '!/[a-zA-Z]+/{gsub(/[^0-9.]+/,"");gsub(/$\n$/,"")} 1' Input_file
答案 3 :(得分:1)
sed
$ sed -E 's/\((([0-9]+\.){3}[0-9]+),-,\)/\n\1/g' file
mynetgroup-test
192.19.23.57
192.19.23.58
你可以微调IP地址匹配,但这种启发式方法应该没问题。