grep 仅返回帮助文本

grep 仅返回帮助文本

嗯,我很困惑。我正在使用 Ubuntu 服务器,然后输入

grep 'bash' *.sh

fgrep 'bash' *.sh

工作出色。

which grep

which fgrep

两者都指向 /bin 中各自的可执行文件。我对自己做错的事情感到困惑。

示例输出:

$ grep -F 'grounding' repl.clj
Usage: grep [OPTION]... PATTERN [FILE]...
Search for PATTERN in each FILE or standard input.
PATTERN is, by default, a basic regular expression (BRE).
Example: grep -i 'hello world' menu.h main.c

$ fgrep 'grounding' repl.clj 
(p/concepts-for-grounding-term imp1  "PERSON" "summary")

看到了吗?grep 失败了,但 fgrep 工作正常。这就是我感到困惑的原因。

答案1

grep、egrep 和 fgrep 的行为不同。你没有在问题中说明你从它们各自得到的结果,因此很难说得更多。以下讨论了这些差异:https://unix.stackexchange.com/questions/17949/grep-egrep-and-fgrep 之间有什么区别?

它们在文件系统上是同一个可执行文件这一事实并不重要,因为它们可能会根据自己的名称改变其行为。这是一个小的优化,用于安装和硬链接到不同名称的可执行文件的单个版本。

答案2

我在 grep 手册页中发现了这一点:

   In  addition,  three  variant  programs  egrep,  fgrep  and  rgrep  are
   available.   egrep  is  the  same  as  grep -E.   fgrep  is the same as
   grep -F.  rgrep is the same as grep -r.  Direct  invocation  as  either
   egrep  or  fgrep  is  deprecated,  but  is provided to allow historical
   applications that rely on them to run unmodified.

fgrep 只是一种快捷方式。egrep 也是。

答案3

Ott - 你让我思考了一下,我查看了我的 .bashrc 文件,发现它确实在别名为 grep 的行上有损坏。我修复了该行,现在它可以正常工作了。

从这个教训中吸取教训。尽量不要使用别名或混淆默认命令ls grep——它只会在以后给你带来麻烦。

而不是像这样使用别名:

alias grep='grep --color=auto --whoopssometypo'

给你的别名起一个原始名称:

alias grepc='grep --color=auto --whoopssomettypo'

这样,您就不会破坏默认命令,并且可以通过一些快速测试快速发现拼写错误。如果grep有效,或者grepc无效,您可以快速判断问题出在grepcnot grep 上。

如果您对由多个管理员共享的环境文件进行了修改,则可能会给您的工作场所带来严重问题。

我有时会对这条规则做一个例外。许多 Linux 发行版都会给一些破坏性命令起别名。以下是 RHEL5 系统中的一个例子:

# alias
alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -i'

别名rm -i曾多次拯救我。但是,依赖这个别名是一个坏习惯,因为迟早你会使用一个rm不存在别名的系统rm -i,并且会意外破坏文件。

相关内容