我有一个文件(test.txt),其中包含以下字符串:
name1,6.5.8.12,specs1,version1,['66.55.89.12']
name2,19.13.13.159,specs2,version2,['13.13.173.59'; '14.19.232.42']
name3,141.101.196.40,specs3,version3,['11.01.196.0']
1)我想捕获第二列和第五列中的所有字符串,这些字符串的格式为四个用点分隔的数字,每个数字最多可以为3位数字。
2)第2列有1个字符串,第5列有无限个字符串,但用分号分隔。
我尝试使用此命令来尝试捕获所有第五列字符串(我仍然需要找出如何捕获第二列和第五列),但此命令首先不起作用。它产生了空文件:
cat test.txt | cut -d ',' -f5 | grep -P -o '\d{1-3}\.\d{1-3}\.\d{1-3}\.\d{1-3}' > result.txt
如何使用ng捕获第二列和第五列中的特殊格式字符串grep
。其中字符串是由点分隔的四个数字(从 1 到 3 位数字)。第二列只有一个字符串,但第五列有无限个字符串,但用分号分隔?
编辑: 预期输出:
6.5.8.12
66.55.89.12
19.13.13.159
13.13.173.59
14.19.232.42
141.101.196.40
11.01.196.0
另请注意,我希望结果经过排序并且是唯一的sort -u
。我在示例中没有重复的字符串,但如果在我的真实文件中找到重复的字符串,我想避免重复。
答案1
是否还有其他字段可以保存您的模式(示例中没有)?如果没有,请尝试
grep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}" file | sort -u
11.01.196.0
13.13.173.59
141.101.196.40
14.19.232.42
19.13.13.159
6.5.8.12
66.55.89.12
如果您希望按数字排序,请使用sort
的-g
选项。
对于问题中给出的您自己的解决方案,请尝试-f2,5
输入cut
字段。
答案2
您的回避awk
需要在问题中给出一些理由,但无论如何,您可以:
$ cut -d, -f2,5 file | egrep -wo '([0-9]{1,3}[.]){3}[0-9]{1,3}'
6.5.8.12
66.55.89.12
19.13.13.159
13.13.173.59
14.19.232.42
141.101.196.40
11.01.196.0
如果您想要输出 sort+uniq'ed,您可以| sort -u
在管道末尾添加自己 ;-)
答案3
这是使用的分步解决方案cut+tr+sort
首先,获取必填字段
$ cut -d, -f2,5 ip.txt
6.5.8.12,['66.55.89.12']
19.13.13.159,['13.13.173.59'; '14.19.232.42']
141.101.196.40,['11.01.196.0']
然后,删除所有不需要的字符
$ cut -d, -f2,5 ip.txt | tr -d "]'[ "
6.5.8.12,66.55.89.12
19.13.13.159,13.13.173.59;14.19.232.42
141.101.196.40,11.01.196.0
然后,将,
和转换;
为换行符,以便每个值都在自己的行上,然后对其进行唯一排序
$ cut -d, -f2,5 ip.txt | tr -d "]'[ " | tr ',;' '\n' | sort -u
11.01.196.0
13.13.173.59
141.101.196.40
14.19.232.42
19.13.13.159
6.5.8.12
66.55.89.12
答案4
修正了我的例子,但它并不优雅。
基本上,awk 分离出字段,我们使用 sed 删除不需要的字符,然后对输出进行排序。抱歉,这个答案中没有 grep。
cat test.txt |awk -F'[,;]' '{print $2"\n" $5}' | sed 's/\(\[\|\]\)//g' |sed "s/'//g" |sort -r