嗯,我很困惑。我正在使用 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
无效,您可以快速判断问题出在grepc
not grep 上。
如果您对由多个管理员共享的环境文件进行了修改,则可能会给您的工作场所带来严重问题。
我有时会对这条规则做一个例外。许多 Linux 发行版都会给一些破坏性命令起别名。以下是 RHEL5 系统中的一个例子:
# alias
alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -i'
别名rm -i
曾多次拯救我。但是,依赖这个别名是一个坏习惯,因为迟早你会使用一个rm
不存在别名的系统rm -i
,并且会意外破坏文件。