问题
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}"',
escaping,
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}\"',
gives the error
awk: "{sum+=}
awk: ^ unterminated string
Any tips appreciated.
回答1:
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:
alias totalmem='ps -u user -o rss,command | awk "!/peruser/ {sum+=\$1} END {print sum/1024}"'
回答2:
You can avoid quoting issues by using a shell function instead of an alias:
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 "$1" -o rss,command | grep -v peruser | awk '{sum+=$1} END {print sum/1024}'
}
回答3:
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. 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.
(Aliases of this size are something that's better done as functions).
来源:https://stackoverflow.com/questions/14560796/bash-aliases-and-awk-escaping-of-quotes