匹配文件中的字符串并打印下一列

时间:2016-02-24 17:10:26

标签: awk grep

我有两个文件input1.txt和input2.txt。

input1.txt包含以下详细信息:

abcd.net
bcad.net
cagh.net
degh.net
usna.net

input2.txt有以下详细信息:

abcd.net 169.254.0.2
bcad.net 169.254.0.3
cagh.net 169.254.0.4
us-1212-qwe.net 169.254.232.50
us-cisco.net 10.120.2.3
degh.net 169.254.0.5
usna.net 169.254.0.6
ab1234.net 169.254.0.7
catorr.net 169.254.0.8

我需要从“input2.txt”文件中获取“input1.txt”中列出的服务器的相应IP详细信息

输出应该是这样的:

abcd.net 169.254.0.2
bcad.net 169.254.0.3
cagh.net 169.254.0.4
degh.net 169.254.0.5
usna.net 169.254.0.6

我的代码如下所示无法正常工作。请帮忙。

  for i in `cat input1.txt`; do more input2.txt | grep -w "^$i"; done

2 个答案:

答案 0 :(得分:2)

awk 'FNR==NR{ip[$1]=$2} FNR!= NR {print $1, ip[$1]}' input2.txt input1.txt

这将读取input2.txt并构建一个由第一列索引的所需数据的数组。然后它读取intput1.txt,并且每行打印主机和数组中的数据。

请注意,上面给出的答案不再适用,因为问题已被编辑。对于编辑过的问题,您可以执行以下操作:

 awk 'FNR==NR{ip[$1".net"]=$2} FNR!= NR {print $1, ip[$1]}' input2.txt input1.txt

但这不是最好的通用解决方案。 (例如,硬编码文本“.net”是一种可怕的方法,但对于快速破解,这很好。)

答案 1 :(得分:1)

awk

的替代品
join <(sort input1) <(sort input2)

abcd.net 169.254.0.2
bcad.net 169.254.0.3
cagh.net 169.254.0.4
degh.net 169.254.0.5
usna.net 169.254.0.6

或好老grep

grep -f input1 input2

abcd.net 169.254.0.2
bcad.net 169.254.0.3
cagh.net 169.254.0.4
degh.net 169.254.0.5
usna.net 169.254.0.6