【问题标题】:Exclude lines from output based on patterns in file根据文件中的模式从输出中排除行
【发布时间】:2013-12-06 06:42:12
【问题描述】:

我在一个文本文件中有几个 IP 地址。我有另一个文件,其中每一行都包含一个 IP 以及一些其他数据。以下示例,

pattern.txt(要排除的 IP):

A.B.C.D
E.F.G.H
I.J.K.L

target.txt(主列表):

server1,L.M.N.O,user1
server2,A,B.C.D,user2
server3,P.Q.R.S,user3

现在我需要创建一个规则(最好是单行),它只列出“target.txt”中的那些行,其 IP 地址出现在“pattern.txt”中。所需的输出如下,

server1,L.M.N.O,user1
server3,P.Q.R.S,user3

我尝试使用这个cat target.txt | grep -f pattern.txt。虽然这并没有完成工作:它只是突出显示我想要排除的 IP,但实际上并没有从输出中排除它们。我做错了什么?

【问题讨论】:

  • 也许可以尝试使用 -v 开关和 grep 来排除字符串。另请注意,您不需要 cat,简单的 grep -v -f pattern.txt target.txt 应该可以工作。
  • @tvm 是的,我也试过这个 - cat target.txt | grep -vf pattern.txt,但它只会产生一个空白输出:/

标签: bash shell unix grep pattern-matching


【解决方案1】:

你可以说:

grep -F -v -f pattern.txt target.txt

提供-F 会将模式解释为固定字符串,因此IP 地址中的. 不会匹配任何任意 字符。

   -F, --fixed-strings
          Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched.  (-F is specified by POSIX.)

【讨论】:

  • 谢谢!这完美!也感谢您的解释。
  • 所以只是为了让我清醒一下,模式文件中的每一行都被解释为一个单独的正则表达式,因此点被这样处理。现在,-F 标志将每一行视为一个简单的字符串,仅此而已,从而导致正确匹配。
  • @JTG 是的,如果没有-F. 将被视为正则表达式元字符。根据您的输入,它可能做了不想要的事情。
猜你喜欢
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 2016-05-31
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
相关资源
最近更新 更多