ошибка при использовании командной строки в качестве удара искажает на Linux

Я хочу сохранить следующую последовательность командной строки как псевдоним удара:

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

Что я делаю неправильно????

4
задан 27.09.2009, 02:15

4 ответа

Откровенно говоря, к тому времени, когда команда получает это большое, я превратил бы ее в сценарий и не псевдоним. Одно преимущество сценария состоит в том, что Вы заставляете его работать с большим количеством файлов, чем просто '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'
5
ответ дан 07.12.2019, 19:07
  • 1
    Это - большой совет! Можно также создать 'функцию удара', но действительно сценарий, вероятно, предпочтен (по крайней мере, в переменных целях обзора). Функции не являются inheritied подоболочками, но сценарии могут все еще быть найдены через $PATH – ericslaw 27.09.2009, 07:07
  • 2
    "Функции не является inheritied подоболочками" - Но можно сделать export -f functionname – Paused until further notice. 27.09.2009, 21:37

Я - немного зеленого на 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; }

Это работает точно псевдонимом.

6
ответ дан 07.12.2019, 19:07

Так как псевдоним определяется в двойных кавычках, команда даты выполняется во время определения псевдонима, и $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'

Проверьте, можете ли Вы выполнить это успешно. Идеально, Вы определили бы псевдоним в одинарных кавычках, но присутствие одинарных кавычек в самом псевдониме делает это хитрым в Вашей ситуации.

4
ответ дан 07.12.2019, 19:07

Другое изменение должно использовать одинарные кавычки для внешних и выйти и заключить внутренние в кавычки. Можно выбрать, какой бы ни метод (этот или тот в ответе 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"

Который делает для легкого для запоминания и очень последовательный метод.

3
ответ дан 07.12.2019, 19:07

Теги

Похожие вопросы