简体   繁体   English

bash_aliases和awk的引号转义

[英]bash_aliases and awk escaping of quotes

I'm trying to create an alias for a command to see the memory use, 我正在尝试为命令创建别名以查看内存使用情况,

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

but, the naive, 但是,天真

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

gives errors: 给出错误:

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

I've tried with double quotes, 我试过用双引号

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

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

totalmem ='ps ... |awk \\'{sum+=$1} END {print sum/1024}\\'' , or escaping double quotes ... but I can't seem to make it work. 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}\\"'

gives the error 给出错误

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

Any tips appreciated. 任何提示表示赞赏。

You can avoid quoting issues by using a shell function instead of an alias: 您可以通过使用Shell函数而不是别名来避免引用问题:

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

This is also more flexible, as you could allow totalmem to take arguments, such as a user name to pass to the -u option of ps , as in this example: 这也更加灵活,因为您可以允许totalmem接受参数,例如将用户名传递给ps-u选项,如以下示例所示:

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

You almost have it, the $ will be expanded in double-quotes, so that needs extra escaping: 您几乎已经拥有了, $将被双引号扩展,因此需要额外的转义:

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

Or with the pattern inside awk as suggested by iiSeymour : 或者使用iiSeymour建议的awk内的模式:

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

Like this: 像这样:

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

Explanation: you may use different kind of quotes for the same argument, like "I'm double-quoted"'and I am $HOME-less'-and-i-am-not-quoted . 说明:对于同一个参数,您可以使用不同类型的引号,例如"I'm double-quoted"'and I am $HOME-less'-and-i-am-not-quoted Hence if you need a single quote inside single quotes, you can add '\\'' which (1) terminates single quoting, (2) adds literal single quote with \\' , (3) starts single quoting again. 因此,如果您需要在单引号内包含一个单引号,则可以添加'\\''其中(1)终止单引号,(2)添加文字单引号与\\' ,(3)再次开始单引号。

(Aliases of this size are something that's better done as functions). (这种大小的别名最好作为函数来完成)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM