【问题标题】:How to escape grep and awk within pipe in an alias?如何以别名在管道中转义 grep 和 awk?
【发布时间】:2014-06-03 05:02:54
【问题描述】:

我想为长命令创建一个别名。但是我无法正确逃脱它,我猜这是管道的问题。

我原来的命令

ps aux | grep gimp | awk '{ print $2 '\011' $11 }' | grep -v 'grep'

我的别名尝试

alias psa="ps aux | grep $1 | awk '{ print \$2 \"\011\" \$11 }' | grep -v 'grep'"

但我得到一个错误,grep 无法打开文件foo(当我打开文件时psa foo
当我删除最后一部分| grep -v 'grep' 时,awk 会抛出同样的错误。

我更喜欢在 shell 脚本之前使用别名。

【问题讨论】:

  • 你原来的命令看起来不对,不应该是print命令中的双引号吗?
  • 别名不处理参数,所以我认为即使你解决了引用问题,你所做的也不会奏效。让它成为一个 shell 函数。
  • 为什么要这样解析ps的输出?它是可怕的!你不是说pgrep -l gimp吗?

标签: bash awk grep pipe alias


【解决方案1】:

如果要插入参数,则需要使用函数:

psa() {
    ps aux | grep "$1" | awk '{print $2 "\t" $11 }' | grep -v grep
}

【讨论】:

  • 您不需要所有这些管道和命令,一个 awk 命令就可以做到:ps aux | awk -v cmd="$1" '($0~cmd)&&($0!~"grep"){print $2 "\t" $11 }'。并不是说总体上这是正确的方法,只是简化了答案。
【解决方案2】:

你可以通过使用一个函数来避免所有的转义:

myps() {
   ps aux | grep gimp | awk '{ print $2 "\011" $11 }' | grep -v 'grep'
}

【讨论】:

    猜你喜欢
    • 2014-07-09
    • 2014-09-06
    • 1970-01-01
    • 2011-03-07
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    相关资源
    最近更新 更多