使用 grep 匹配第二列和第五列中的字符串的正则表达式

使用 grep 匹配第二列和第五列中的字符串的正则表达式

我有一个文件(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

相关内容