2013-01-28 16 views
5

Sto cercando di creare un alias per un comando per vedere l'uso della memoria,bash_aliases e awk fuga di citazioni

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

ma, l'ingenuo,

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

dà errori:

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

ho provato con le doppie virgolette,

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

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

totalmem ='ps ... |awk \'{sum+=$1} END {print sum/1024}\'', o fuggire le virgolette ... ma non riesco a farlo funzionare.

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

dà l'errore

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

Eventuali suggerimenti apprezzato.

+1

http: // www. unix.com/shell-programming-scripting/38249-define-alias-embeded-awk-command.html –

+2

Non è mai necessario 'grep' con' awk '$ 0! ~/peruser/{sum + = $ 1} END {print sum/1024 } '' –

risposta

7

Devi quasi esso, sarà ampliato in virgolette il $, in modo che ha bisogno di fuga in più:

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

oppure con il modello interno awk come suggerito da iiSeymour:

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

grazie a dio del martello. Avevo appena trovato una soluzione con 'alias memuse = 'ps -u utente -o rss, comando | grep -v peruser | awk '"'" '{sum + = $ 1} END {print sum/1024}' "'"' ''ma il tuo è più pulito – Massagran

4

Ti piace questa:

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

Spiegazione: è possibile utilizzare diversi tipi di citazioni per lo stesso argomento, come "I'm double-quoted"'and I am $HOME-less'-and-i-am-not-quoted. Quindi se hai bisogno di una singola citazione all'interno di virgolette singole, puoi aggiungere '\'' che (1) termina la citazione singola, (2) aggiunge la citazione singola letterale con \', (3) inizia nuovamente la quotazione singola.

(gli alias di queste dimensioni sono qualcosa che va meglio come funzioni).

+0

grazie per la spiegazione – Massagran

11

È possibile evitare di citare problemi utilizzando una funzione di shell anziché un alias:

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

Questo è anche più flessibile, come si potrebbe consentire di prendere totalmem argomenti, come ad esempio un nome utente per passare all'opzione -u di ps, come in questo esempio:

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