erro ao usar a linha de comando como um alias bash no linux

4

Eu quero salvar a seguinte sequência de linha de comando como um alias bash:

grep  'date '+%d/%b/%Y'' access.logs  | egrep 2765330645ae47d292c9ceac725d744e.py |awk '{print $1, $4, $5, $7, $8, $9, $10}' | sort |uniq -c -w15 |sort -n

Funciona bem na linha de comando, mas falha quando tento configurá-lo como um alias. Eu tentei adicionar o seguinte ao .bash_profile:

alias downloads="grep  'date '+%d/%b/%Y'' access.logs  | egrep 2765330645ae47d292c9ceac725d744e.py |awk '{print $1, $4, $5, $7, $8, $9, $10}' | sort |uniq -c -w15 |sort -n"

e obtenho os seguintes erros:

-bash-3.2$ downloads
awk: {print , , , , , , 0}
awk:        ^ syntax error
awk: {print , , , , , , 0}
awk:          ^ syntax error
awk: {print , , , , , , 0}
awk:            ^ syntax error
awk: {print , , , , , , 0}
awk:              ^ syntax error
awk: {print , , , , , , 0}
awk:                ^ syntax error
awk: {print , , , , , , 0}
awk:                  ^ syntax error

O que estou fazendo de errado ????

    
por cfischer 27.09.2009 / 01:15

5 respostas

5

Francamente, no momento em que um comando fica tão grande, eu o transformaria em um script e não em um alias. Uma vantagem de um script é que você faz com que ele funcione com mais arquivos do que apenas 'access.logs'.

Essa sequência de comandos envolve tanto aspas simples quanto as aspas - isso sempre aumenta a diversão. Geralmente, é melhor usar $(command args) no lugar de citações anteriores.

Quando você usa as aspas duplas em torno do alias, os comandos citados por trás são executados quando o alias é criado - a menos que o shell tenha uma maneira diferente de interpretar as coisas ao definir o alias. Além disso, as expressões $var são avaliadas entre aspas duplas, portanto, os erros awk mostram que você não possui argumentos no shell atual.

Portanto, se você precisar usar um alias, provavelmente precisará usar aspas simples em torno da expressão inteira, além de cada uma das aspas simples que aparecem na expressão, substitua-as pela sequência quote-backslash-quote-quote:% código%. A primeira cotação finaliza a string citada atual; a citação da barra invertida representa uma citação literal; a cotação final reinicia a string citada.

Isso leva a:

alias downloads='grep  'date '\''+%d/%b/%Y'\''' access.logs |
                 egrep 2765330645ae47d292c9ceac725d744e.py |
                 awk '\''{print $1, $4, $5, $7, $8, $9, $10}'\'' |
                 sort | uniq -c -w15 | sort -n'
    
por 27.09.2009 / 04:14
6

Sou um pouco verde no Linux, então não sei exatamente por que não funciona. Mas você pode usar uma função em vez disso.

No .profile / .bashrc, crie uma nova função:

downloads() { grep  'date '+%d/%b/%Y'' access.logs  | egrep 2765330645ae47d292c9ceac725d744e.py |awk '{print $1, $4, $5, $7, $8, $9, $10}' | sort |uniq -c -w15 |sort -n; }

Isso funciona exatamente como um alias.

    
por 27.09.2009 / 01:37
4

Como o alias é definido entre aspas duplas, o comando date é executado no momento da definição do alias, e as variáveis $1 também são expandidas. Você pode verificar isso procurando o alias depois de defini-lo:

$ alias downloads="grep  'date '+%d/%b/%Y'' access.logs  | egrep 2765330645ae47d292c9ceac725d744e.py |awk '{print $1, $4, $5, $7, $8, $9, $10}' | sort |uniq -c -w15 |sort -n"
$ alias downloads
alias downloads='grep  27/Sep/2009 access.logs  | egrep 2765330645ae47d292c9ceac725d744e.py |awk '\''{print , , , , , , 0}'\'' | sort |uniq -c -w15 |sort -n'

Você deve conseguir consertar isso escapando a chamada date e as variáveis $1 :

$ alias downloads="grep  \'date '+%d/%b/%Y'\' access.logs  | egrep 2765330645ae47d292c9ceac725d744e.py |awk '{print \, \, \, \, \, \, \}' | sort |uniq -c -w15 |sort -n"
$ alias downloads
alias downloads='grep  'date '\''+%d/%b/%Y'\''' access.logs  | egrep 2765330645ae47d292c9ceac725d744e.py |awk '\''{print $1, $4, $5, $7, $8, $9, $10}'\'' | sort |uniq -c -w15 |sort -n'

Verifique se você pode executar isso com sucesso. Idealmente, você definiria o alias entre aspas simples, mas a presença de aspas simples dentro do próprio alias torna isso complicado em sua situação.

    
por 27.09.2009 / 01:36
3

Outra variação é usar aspas simples para as externas e escapar e citar as internas. Você pode escolher qualquer método (este ou aquele na resposta do nagul ) faz o resultado menos feio para uma situação particular.

alias downloads='grep  $(date '\''+%d/%b/%Y'\'') access.logs  | egrep 2765330645ae47d292c9ceac725d744e.py |awk '\''{print $1, $4, $5, $7, $8, $9, $10}'\'' | sort |uniq -c -w15 |sort -n'

Você provavelmente perceberá que isso é o que alias imprime de qualquer maneira se você escapar de todos os cifrões.

Tomei a liberdade de alterar os backticks em $() para legibilidade e versatilidade .

Se você usar o método nagul's (incluindo aspas duplas para os externos) e $() ao invés dos backticks, tudo que você tem que escapar são os cifrões.

alias downloads="grep  \$(date '+%d/%b/%Y') access.logs  | egrep 2765330645ae47d292c9ceac725d744e.py |awk '{print \, \, \, \, \, \, \}' | sort |uniq -c -w15 |sort -n"

O que torna um método fácil de lembrar e muito consistente.

    
por 27.09.2009 / 01:54
0

Como você usaria o valor obtido no awk e armazenaria uma variável? É com isso que estou começando.

alias xx2='xrandr | awk '\''$2=="connected"{s=$1} END{print s}'\'''

É isso que estou tentando fazer.

VAR=$(xrandr | awk '$2=="connected"{s=$1} END{print s}'); xrandr --output $VAR --mode 1024x768 --rate 60; xrandr --output LVDS1 --left-of $VAR; xrandr --output LVDS1 --primary; unset VAR;

Esta foi a minha primeira ideia. Eu vi que não está atribuindo nenhum valor ao VAR depois que eu tentei abrir o OMG.

alias xx2='VAR=$(xrandr | awk '\''$2=="connected"{s=$1} END{print s}'\''); echo $VAR > OMG'

    
por 01.06.2012 / 09:07