如何制作别名以缩短grep命令

Buf*_*lls 9 shell grep alias

在我的编码中,我总是这样做 grep -rnIi "abcabc" . --color

但是,如何制作一个只能让我在搜索字符串中输入一个单词的别名?那可能吗?

slm*_*slm 13

注意这个问题的标签。鉴于grepCentOS 6 包含的版本低于 2.11版,此答案是正确的

我不相信您可以仅使用别名来做到这一点(至少不是您编写的形式 - 请参阅@Graeme 的替代语法的答案)。

注意:我还要在这里提到,@Graeme 的解决方案虽然正确但在 CentOS 5 和 6 上不起作用。我已经确认了这一点,实际上它似乎grep是捆绑的(2.11 或更旧)版本的问题那些发行版。问题似乎是grep默认情况下,当-r开关没有提供路径参数时,不搜索 STDIN 。运行grep -rnIi --color "string"只是无限期挂起,试图搜索标准输入。

别名不能接受传递给它们的参数。它们更像是宏的同义词,在那里它们可以被 shell 扩展为其他东西。

$ alias ll='ls -l'
Run Code Online (Sandbox Code Playgroud)

然后可以像这样使用:

$ ll
-or-
$ ll somedir
Run Code Online (Sandbox Code Playgroud)

但somedir不会传递给ll,而是在您的命令中ll扩展到ls -l然后替换ll。

回到你的问题

您可以改用 shell 中的函数。函数可以接受参数。

$ function mygrep { grep -rnIi "$1" . --color; }
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

$ mygrep "blah"
Run Code Online (Sandbox Code Playgroud)

    前任的 ss


Gra*_*eme 9

这实际上可以是别名。The--color不必在最后,如果没有给出目录选项grep,-r则始终搜索当前目录(至少 GNUgrep是这样)。因此你可以这样做:

alias mygrep='grep -rnIi --color'
Run Code Online (Sandbox Code Playgroud)

更新

默认情况下搜索当前目录的行为是在GNU grep 2.11. 从变更日志:

如果没有给出文件操作数,并且给出了命令行 -r 或等效选项,grep 现在搜索工作目录。以前 grep 忽略 -r 并以非递归方式搜索标准输入。在 GREP_OPTIONS 中找到的 -r 没有这种新效果。

因此,在 的版本>=2.11上GNU grep,别名的用法如下:

mygrep PATTERN [PATH...]
Run Code Online (Sandbox Code Playgroud)

对于grep在此之前的版本,每次@slm使用函数的答案时您都必须指定路径是最好的方法。虽然您可以通过编写这样的函数来实现与上述相同的用法:

mygrep () { grep -rnIi --color "$1" "${2:-.}"; }
Run Code Online (Sandbox Code Playgroud)

当然,假设没有要求--color像 Q 中那样在最后......