【问题标题】:Why doesn't grep return the whole line in this case? [duplicate]在这种情况下,为什么 grep 不返回整行? [复制]
【发布时间】:2016-03-10 18:18:43
【问题描述】:

我正在练习在 Mac OSX 中使用终端。

我从根目录转到/dev/ 文件夹,并想查找包含null 的行,所以我使用ls 来获取文件夹内容。有很多,所以我认为这是使用grep 的机会。所以我输入了ls | grep "null",然后简单地返回null,而不是正常的ls列表中显示的整行null ttyp9

为什么会这样?我以为grep 回复了完整的行?

【问题讨论】:

  • 为什么是lsgrep,就用printf "%s\n" *null*
  • 仅供参考,parsing the output of ls is generally considered bad。另请参阅:askubuntu.com/questions/578242/… 当然,如果您只是在学习,这是一种很好的练习方式,因为您可能会遇到所有奇怪的情况:)
  • @whrrgarbl 是的,只是学习。感谢这些链接
  • @whrrgarbl 阅读该链接...什么?!我没有意识到 Unix 对文件名中允许的字符如此宽容。
  • @ArukaJ - 不,解析find 也不是一直有效。检查mywiki.wooledge.org/ParsingLs 以获得解释和策略。 (提示:使用for 循环,如果需要递归,请使用globstar。)

标签: linux macos bash grep


【解决方案1】:

ttyp9 是一个不同的文件。

ls 正在向您显示输出列。

当未发送到终端时,ls 不会这样做,就像您使用了 -1 参数一样。

【讨论】:

  • 所以grep 不会返回与输出一起显示的行(在本例中为带有ls 的文本列),而是以某种线性方式?或者更确切地说,列的东西是ls之外的东西?
  • 不,grep 确实返回了它得到的行。 you get 和 grep get 的行在这里是不同的。运行ls -1,你会看到grep看到了什么。
  • 列输出是ls 在向终端显示时所做的,以便人们 更容易同时查看多个文件。它还“知道”其他工具无法处理(并且不应该这样做),因此在其输出是终端和输出不是终端的情况下,它默认具有不同的行为.例如,查看lsls | cat 之间的区别。
  • 尝试man ls 看看-1 是什么意思。 “强制输出为每行一个条目。这是不输出到终端时的默认设置。”现在更有意义了。谢谢!
【解决方案2】:

grep 确实返回整行。 ls 命令本身并未提供详细信息。试试这个:

ls -l | grep "null"

该列表标志提供了更多详细信息,然后 grep 可以返回。

换句话说,grep 正在做你想做的事,没有什么可看的。

不带选项的ls 命令只会显示文件名。通常,返回的文件名列表被包装。如果你输入,你可以打开它们:

ls -1

如果您查看此列表,您会发现 null 实际上是单独一行。

如果添加long listing 选项:

ls -l

您会看到更多细节。 grep 命令只能返回给它的内容,在这种情况下,ls 是为 grep 提供所有输入的内容。

【讨论】:

  • 不是他要找的细节。
猜你喜欢
  • 2021-01-31
  • 2020-03-31
  • 1970-01-01
  • 2016-03-02
  • 2014-09-12
  • 2018-04-26
  • 2018-05-21
  • 2021-12-03
  • 1970-01-01
相关资源
最近更新 更多