9

我正在尝试为命令创建别名以查看内存使用情况,

ps -u user -o rss,command | grep -v peruser | awk '{sum+=$1} END {print sum/1024}'

但是,天真的,

#.bash_aliases
alias totalmem='ps -u user -o rss,command | grep -v peruser | awk '{sum+=$1} END {print sum/1024}''

给出错误:

-bash: alias: END: not found
-bash: alias: {print: not found
-bash: alias: sum/1024}: not found

我试过用双引号,

totalmem ="ps ... |awk '{sum+=$1} END {print sum/1024}'", 或者

totalmem ='ps ... |awk "{sum+=$1} END {print sum/1024}"', 逃避,

totalmem ='ps ... |awk \'{sum+=$1} END {print sum/1024}\'',或转义双引号......但我似乎无法让它工作。

totalmem ='ps ... |awk \"{sum+=$1} END {print sum/1024}\"',

给出错误

awk: "{sum+=}
awk: ^ unterminated string

任何提示表示赞赏。

4

3 回答 3

17

您可以通过使用 shell 函数而不是别名来避免引用问题:

totalmem () {
  ps -u user -o rss,command | grep -v peruser | awk '{sum+=$1} END {print sum/1024}'
}

这也更加灵活,因为您可以允许totalmem接受参数,例如传递给-u选项的用户名ps,如下例所示:

totalmem () {
  ps -u "$1" -o rss,command | grep -v peruser | awk '{sum+=$1} END {print sum/1024}'
}
于 2013-01-28T11:28:37.297 回答
10

您几乎拥有它,$它将以双引号扩展,因此需要额外的转义:

alias totalmem='ps -u user -o rss,command | grep -v peruser | awk "{sum+=\$1} END {print sum/1024}"'

或者使用iiSeymourawk建议的内部模式:

alias totalmem='ps -u user -o rss,command | awk "!/peruser/ {sum+=\$1} END {print sum/1024}"'
于 2013-01-28T11:20:14.163 回答
9

像这样:

alias totalmem='ps -u user -o rss,command | grep -v peruser | awk '\''{sum+=$1} END {print sum/1024}'\'

说明:您可以为同一个参数使用不同类型的引号,例如"I'm double-quoted"'and I am $HOME-less'-and-i-am-not-quoted. 因此,如果您需要单引号内的单引号,您可以添加'\''which (1) 终止单引号,(2) 添加文字单引号\', (3) 再次开始单引号。

(这种大小的别名最好作为函数来完成)。

于 2013-01-28T11:18:21.120 回答