псевдонимы в bash и awk экранирование кавычек

Я пытаюсь создать псевдоним для команды, чтобы увидеть использование памяти,

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

но, наивные,

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

выдает ошибки:

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

Я пробовал с двойными кавычками,

totalmem ="ps ... |awk '{sum+=} END {print sum/1024}'" или

totalmem ='ps ... |awk "{sum+=} END {print sum/1024}"', побег,

totalmem ='ps ... |awk '{sum+=} END {print sum/1024}'', или избежать двойных кавычек ... но у меня ничего не получается.

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

выдает ошибку

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

любые советы с благодарностью.

3 ответов


у вас почти получилось,$ будет расширен в двойных кавычках, так что требуется дополнительное экранирование:

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

или с рисунком внутри awk как было предложено iiSeymour:

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

вы можете избежать проблем с цитированием, используя функцию оболочки вместо псевдонима:

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

Это также более гибко, как вы могли бы позволить totalmem принимать аргументы, такие как имя пользователя для передачи в на ps, например:

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

такой:

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

объяснение: вы можете использовать различные кавычки для одного и того же аргумента, например "I'm double-quoted"'and I am $HOME-less'-and-i-am-not-quoted. Следовательно, если вам нужна одна цитата внутри одинарных кавычек, вы можете добавить '\'' который (1) завершает одинарное цитирование, (2) добавляет буквальную одинарную кавычку с \', (3)снова начинает одиночное цитирование.

(псевдонимы такого размера-это то, что лучше делать как функции).