2013-01-28 9 views
5

Próbuję utworzyć alias dla polecenia, aby zobaczyć wykorzystanie pamięci,bash_aliases i awk Cytowanie cytatów

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

ale naiwny,

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

daje błędy:

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

Próbowałem z podwójnymi cytatami,

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

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

totalmem ='ps ... |awk \'{sum+=$1} END {print sum/1024}\'', lub ucieczki cudzysłów ... ale nie wydaje się, aby to działało.

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

daje błąd

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

Wszelkie wskazówki mile widziane.

+1

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

+2

Nigdy nie potrzebujesz 'grep' z' awk '$ 0! ~/peruser/{sum + = $ 1} END {print sum/1024 } '' –

Odpowiedz

7

Prawie mieć, tym $ zostanie poszerzona w cudzysłów, tak że potrzebuje dodatkowej cytowanie:

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

Albo z wzorem wewnątrz awk jako sugerowane przez iiSeymour:

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

dzięki Bogu młota. Właśnie znalazłem rozwiązanie z 'alias memuse = 'ps -u użytkownik -o rss, polecenie | grep -v peruser | awk '' '' '{sum + = $ 1} END {print sum/1024}' "'"' '' 'ale twoja jest czystsza – Massagran

4

Jak to:

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

Objaśnienie: można użyć innego rodzaju cytatów dla tej samej argumentacji, jak "I'm double-quoted"'and I am $HOME-less'-and-i-am-not-quoted. Dlatego jeśli potrzebujesz pojedynczego cudzysłowu w pojedynczym cudzysłowie, możesz dodać '\'', który (1) kończy pojedyncze cytowanie, (2) dodaje literalny pojedynczy cytat z \', (3) ponownie rozpoczyna pojedyncze cytowanie.

(Aliasy tej wielkości są lepiej wykonywane jako funkcje).

+0

dzięki za wyjaśnienie – Massagran

11

Można uniknąć problemów z cytowaniem za pomocą funkcji powłoki zamiast aliasu:

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

Jest również bardziej elastyczne, jak można pozwolić totalmem wziąć argumenty, takie jak nazwa użytkownika, aby przejść do opcji ps-u, jak w poniższym przykładzie:

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