egrep -v匹配每行包含一些相同文本的行

时间:2015-08-19 13:44:49

标签: bash grep pattern-matching string-matching

所以我有两个文件。

文件1内容的示例。

/n01/mysqldata1/mysql-bin.000001
/n01/mysqldata1/mysql-bin.000002
/n01/mysqldata1/mysql-bin.000003
/n01/mysqldata1/mysql-bin.000004
/n01/mysqldata1/mysql-bin.000005
/n01/mysqldata1/mysql-bin.000006

文件2内容的示例。

/n01/mysqlarch1/mysql-bin.000004
/n01/mysqlarch1/mysql-bin.000001
/n01/mysqlarch2/mysql-bin.000005

所以我想只根据mysql-bin.00000X而不是每个文件中的其余文件路径进行匹配,因为它们在file1和file2之间不同。

这是我正在尝试运行的命令

cat file1 | egrep -v file2

我希望这里的输出是......

/n01/mysqldata1/mysql-bin.000002
/n01/mysqldata1/mysql-bin.000003
/n01/mysqldata1/mysql-bin.000006

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

根据/

中的所有内容进行比较
$ awk -F/ 'FNR==NR {a[$NF]; next} !($NF in a)' f2 f1
/n01/mysqldata1/mysql-bin.000002
/n01/mysqldata1/mysql-bin.000003
/n01/mysqldata1/mysql-bin.000006

解释

这将读取内存中的file2,然后与file1进行比较。

  • -F/将字段分隔符设置为/
  • FNR==NR {a[$NF]; next}在读取第一个文件(file2)时,将每个最后一个文件存储到数组a[]中。由于我们将字段分隔符设置为/,因此这是mysql-bin.00000X部分。
  • !($NF in a)在读取第二个文件(file1)时,检查最后一个字段(mysql-bin.00000X部分)是否在数组a[]中。如果没有,请打印该行。
  

我遇到了一个在测试时已经注意到的问题。如果file2是   没有任何东西可以返回,就像我期望的那样   在file1中返回。这是你可以帮助我的东西吗?   请? - user2841861。

然后问题是FNR==NR在读取第二个文件时匹配。为了防止这种情况,只需交叉检查第一个文件中的“读入[]数组”操作:

awk -F/ 'FNR==NR && argv[1]==FILENAME {a[$NF]; next} !($NF in a)' f2 f1
                 ^^^^^^^^^^^^^^^^^^^^

来自man awk

  

<强> ARGV

     

awk程序可用的命令行参数存储在   数组称为ARGV。 ARGC是命令行参数的数量   当下。请参见其他命令行参数一节。不像大多数awk   数组,ARGV从零索引到ARGC - 1