【问题标题】:How to understand this strange grep command with “--” symbol如何理解这个带有“--”符号的奇怪 grep 命令
【发布时间】:2016-04-10 09:23:41
【问题描述】:

运行以下 grep 命令时得到奇怪的结果,首先“1.txt”的内容是这样的:

401 f
-- -----

那么当使用cat 1.txt | grep -v -- --时,结果是401 f,命令cat 1.txt | grep -v -- -,结果也是401 f。我知道第一个字段中的-- 是grep 的过滤模式,所以我认为第二个字段中的--- 可能都表示标准输出,对吧?然后我运行cat 1.txt | grep -v --,这里我省略了stdout,但它是错误的,信息是Try 'grep --help' for more information。虽然我也运行了cat 1.txt | grep -v -,并且这行得通,但结果是401 f

为了进一步了解 grep 中 --- 之间的区别,我运行 cat 1.txt | grep --,它显示 Try 'grep --help' for more informationcat 1.txt | grep - 得到结果 -- -----

顺便说一句,我试过了

  1. cat 1.txt | grep -v '--' --
  2. cat 1.txt | grep -v '--' -
  3. cat 1.txt | grep -v '--'
  4. cat 1.txt | grep -v '-'
  5. cat 1.txt | grep '--'
  6. cat 1.txt | grep '-'

最后,我得到了相同的对应结果。

我的问题可能是

  1. 第二个字段---有什么区别?

  2. 为什么我不能使用-- 模式得到-- ----- 行内?

【问题讨论】:

  • -- 不带引号表示“选项结束”
  • @M.M 引号无关紧要。

标签: linux shell grep


【解决方案1】:

-- 在使用 getopt 的实用程序中用于表示选项结束。

来自manual

特殊参数“--”强制结束选项扫描,无论扫描模式如何。

因此在实践中,您的第一个 -- 参数将被忽略。如果你想 grep -- 你需要 grep .... -- --

【讨论】:

  • grep -v -- bla 中,-- 是指选项的结尾,还是-v 的参数(在第一种情况下,bla 是否成为-v 的参数)
  • @M.M -v 不接受参数。 Grep 调用是grep [OPTIONS] PATTERN [FILE...]blah 仍然是模式,-v 仍然是唯一的选择。
【解决方案2】:

你得到你所得到的,因为你使用了“-v”,这意味着'显示任何不匹配的东西'。

关于——又名。双破折号:

双破折号是对底层 getopt 库的一个信号,它处理命令行选项的解析,双破折号之后的所有内容都必须被视为文字字符串,而不是参数,无论前导破折号如何. 例如。

  • 'grep -v test' 将在标准输入上查找所有与 'test' 不匹配的行。
  • 'grep -- -v test' 将在文件 test 中查找所有匹配 "-v" 的行

你的 grep 基本上是在寻找 任何不是“-”的东西

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-23
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 2015-12-04
    相关资源
    最近更新 更多