【问题标题】:How do I shorten this grep command?如何缩短此 grep 命令?
【发布时间】:2015-04-02 03:14:21
【问题描述】:

我希望我的 grep 命令更短,例如,能够只在命令行上键入 g 以执行带有选项 -Peigrep

我尝试在 Bash 中使用别名,但管道不起作用。

 alias g='grep --color auto -Pei'

给我

 history |g qemu
 grep: auto: No such file or directory
 grep: qemu: No such file or directory

然后我尝试了.bashrc

 function g () { /bin/grep -Pei "$@" ;}

它仍然输出

 history |g qemu
 grep: qemu: No such file or directory

【问题讨论】:

  • 你使用哪个版本的 grep,GNU 还是 BSD?
  • 别名通过将命令的第一个单词替换为其他内容并执行结果来工作。这意味着如果完整的命令grep --color auto -Pei qemu 不起作用,那么创建alias g='grep --color auto -Pei' 和运行g qemu 也不起作用,因为它们扩展为完全相同的命令。尝试先写出一个完整的、有效的命令,然后再给它起别名。
  • Thorsten,你的问题已经解决了,这对来说很好。将答案标记为已接受(无论是否属于我)有助于其他人(未来的读者)。

标签: linux bash shell grep


【解决方案1】:

您的别名有两个不同的问题:

  • 长格式 GNU 选项(以 -- 而不是 - 开头的选项)需要在选项名称和它的值(参数)之间使用 =

    • 即,它应该是--color=auto,而不是--color auto
  • 您错误地使用了选项-e:其目的是接受多个搜索模式,其中每个 -e实例需要一个论点 - 在您的情况下,[-]e 后面直接跟 i,因此错误地充当 -e 的论点,即作为 模式,导致您的真正搜索模式被误解为 文件名 操作数。

因此,重新定义您的别名如下:

alias g='grep --color=auto -Pi'

更新:正如tripleee's answer 所暗示的那样,使用-e 有一个优势:它允许您指定- 开头的模式,而不会被误解为更多选择;因此,将-e last 放在别名中会给您带来这种优势。

alias g='grep --color=auto -Pie'

当然,不将-e 构建到别名中总是让您在调用别名时按需指定它,这将利用多个 -e 选项更直观。


最后,@thatotherguy 在评论中给出的建议值得关注:

在定义别名之前,请确保其定义与直接输入的命令一样正常工作。

【讨论】:

  • 很高兴听到这个消息,托尔斯滕。为了受访者和未来读者的利益:如果答案解决了您的问题,请点击旁边的大复选标记接受;如果您发现答案有帮助,请点击向上箭头图标投票。 (你可以两者都做。)
【解决方案2】:

-e 选项不正确。您使用它的方式是指定搜索表达式为i(即-Pei 被解释为-P -e i,而不是-P -e -i)。切换到-Pie(如果您预计不需要搜索以破折号开头的表达式,则直接切换到-Pi)。

在第一次尝试中,您还需要一个等号,而不是 colorauto 之间的空格。

您通常应该更喜欢函数而不是别名,尽管在这种有限的情况下,别名也可以工作。

function 关键字是 bashism;删除它可以提高代码的可移植性。

不要指定grep的路径;相反,请确保您的 PATH 是理智的。

g () { grep -Pie "$@" ;}

【讨论】:

  • +? 指出-e 对以- 开头的模式很有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
  • 2020-05-04
  • 2019-07-18
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多