Bash 如何在别名中的管道中转义grep和awk?

Bash 如何在别名中的管道中转义grep和awk?,bash,awk,grep,pipe,alias,Bash,Awk,Grep,Pipe,Alias,我想为长命令创建别名。但我无法正确逃脱,我想这是管道的问题 我的原始命令 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

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

我的原始命令

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脚本之前使用别名

使用函数可以避免所有转义:

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

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

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

您原来的命令看起来不正确,是不是应该在
print
命令中使用双引号?别名不会处理参数,因此我认为即使您解决了引号问题,您所做的也不会起作用。让它成为一个shell函数。为什么像这样解析
ps
的输出?太可怕了!你不是指
pgrep-lgimp
?你不需要所有的管道和命令,一个awk命令就可以了:
ps aux | awk-v cmd=“$1”($0~cmd)&($0!“grep”){print$2”\t“$11}
。总的来说,不是说这是正确的方法,只是简单地简化了答案。