bash_aliases和awk转义引号

Mas*_*ran 7 bash awk alias quote

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

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

但是,天真的,

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

给出错误:

-bash: alias: END: not found
-bash: alias: {print: not found
-bash: alias: sum/1024}: not found
Run Code Online (Sandbox Code Playgroud)

我试过双引号,

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
Run Code Online (Sandbox Code Playgroud)

任何提示赞赏.

che*_*ner 15

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

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

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

totalmem () {
  ps -u "$1" -o rss,command | grep -v peruser | awk '{sum+=$1} END {print sum/1024}'
}
Run Code Online (Sandbox Code Playgroud)


Tho*_*hor 8

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

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

或者使用iiSeymourawk建议的内部图案:

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

  • 感谢锤子之神.我刚刚找到了一个带有'alias memuse ='ps -u user -o rss,command |的解决方案 grep -v peruser | awk'"'"'{sum + = $ 1} END {print sum/1024}''''''``但你的更清洁 (3认同)

Ant*_*nko 6

像这样:

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

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

(这种大小的别名是最好的功能).