使用文本编辑器(如sed或awk或tr)转换unix或Linux中的文本数据

时间:2018-05-08 18:01:58

标签: awk sed tr

我的文件有千位数据,例如括号内的IP地址以及逗号和连字符。在哪里我会删除所有替换IP地址替换IP地址出现在没有空行或空格的换行符..

下面是一个示例文件..

Patch

我现在的解决方案如下,但它可以更好或以更好的控制方式简化

$ cat file1
mynetgroup-test (192.19.23.57,-,) (192.19.23.58,-,)

4 个答案:

答案 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地址匹配,但这种启发式方法应该没问题。