bash_aliases和awk转义引号

时间:2013-01-28 11:14:20

标签: bash awk alias quote

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

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

任何提示赞赏。

3 个答案:

答案 0 :(得分:14)

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

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

这也更灵活,因为您可以允许totalmem接受参数,例如用户名传递给-u的{​​{1}}选项,如下例所示:< / p>

ps

答案 1 :(得分:7)

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

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

或者 iiSeymour 建议的awk内的模式:

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

答案 2 :(得分:6)

像这样:

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。因此,如果您需要在单引号内使用单引号,则可以添加'\'',其中(1)终止单引号,(2)使用\'添加文字单引号,(3)再次开始单引号。< / p>

(这个大小的别名是最好的功能)。