Я хочу сохранить следующую последовательность командной строки как псевдоним удара:
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
Это хорошо работает, формируют командную строку, но сбои, когда я пытаюсь установить его как псевдоним. Я пытался добавить следующее к .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"
и я получаю следующие ошибки:
-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
Что я делаю неправильно????
Откровенно говоря, к тому времени, когда команда получает это большое, я превратил бы ее в сценарий и не псевдоним. Одно преимущество сценария состоит в том, что Вы заставляете его работать с большим количеством файлов, чем просто 'access.logs'.
Та последовательность команды включает и одинарные кавычки и одинарные левые кавычки - который всегда добавляет к забаве. Обычно Вы - более обеспеченное использование $(command args)
вместо одинарных левых кавычек.
При использовании двойных кавычек вокруг псевдонима заключенные в кавычки из спины команды выполняются, поскольку псевдоним создается - если оболочка не имеет другой способ интерпретировать вещи, когда они определяют псевдоним. Кроме того, $var
выражения оценены в двойных кавычках, таким образом, Ваш awk
ошибки показывают, что у Вас нет аргументов в текущей оболочке.
Так, если необходимо использовать псевдоним, затем, вероятно, необходимо использовать одинарные кавычки вокруг целого выражения, плюс для каждой одинарной кавычки, которая появляется в выражении, замените его последовательностью quote-backslash-quote-quote: '\''
. Первая кавычка завершает текущую заключенную в кавычки строку; кавычка обратной косой черты представляет литеральную кавычку; заключительная кавычка перезапускает заключенную в кавычки строку.
Это приводит к:
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'
Я - немного зеленого на Linux, таким образом, я не уверен точно, почему он не работает. Но можно использовать функцию вместо этого.
В .profile/.bashrc создают новую функцию:
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; }
Это работает точно псевдонимом.
Так как псевдоним определяется в двойных кавычках, команда даты выполняется во время определения псевдонима, и $1
переменные расширены также. Можно проверить это путем поиска псевдонима после определения его:
$ 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'
Необходимо смочь зафиксировать это путем выхода из вызова даты и $1
переменные:
$ 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 `date '\''+%d/%b/%Y'\''` access.logs | egrep 2765330645ae47d292c9ceac725d744e.py |awk '\''{print $1, $4, $5, $7, $8, $9, $10}'\'' | sort |uniq -c -w15 |sort -n'
Проверьте, можете ли Вы выполнить это успешно. Идеально, Вы определили бы псевдоним в одинарных кавычках, но присутствие одинарных кавычек в самом псевдониме делает это хитрым в Вашей ситуации.
Другое изменение должно использовать одинарные кавычки для внешних и выйти и заключить внутренние в кавычки. Можно выбрать, какой бы ни метод (этот или тот в ответе nagul) делает наименее ужасный результат для конкретной ситуации.
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
распечатывает так или иначе, если Вы выходите из всех знаков доллара.
Я брал на себя смелость изменения обратных галочек в $()
для удобочитаемости и универсальности.
Если Вы используете метод nagul (включая двойные кавычки для внешних) и $()
вместо обратных галочек все, из чего необходимо выйти, является знаками доллара.
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"
Который делает для легкого для запоминания и очень последовательный метод.
export -f functionname
– Paused until further notice. 27.09.2009, 21:37