Ошибка при использовании командной строки в качестве псевдонима bash в linux
Я хочу сохранить следующую последовательность командной строки как псевдоним 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
Он отлично работает из командной строки, но не удается, когда я пытаюсь установить его в качестве псевдонима. Я попытался добавить следующее.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
Что я делаю неправильно????
5 ответов
Честно говоря, к тому времени, когда команда становится настолько большой, я превращаю ее в сценарий, а не в псевдоним. Одним из преимуществ скрипта является то, что вы заставляете его работать с большим количеством файлов, чем просто "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; }
Это работает именно как псевдоним.
Поскольку псевдоним определяется в двойных кавычках, команда date выполняется во время определения псевдонима, и $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'
Проверьте, можете ли вы запустить это успешно. В идеале вы должны определять псевдоним в одинарных кавычках, но наличие одинарных кавычек в самом псевдониме делает это сложным в вашей ситуации.
Другой вариант заключается в использовании одинарных кавычек для внешних и экранирования и цитирования внутренних. Вы можете выбрать, какой метод (этот или тот, что есть в ответе Нагула) принесет наименьший уродливый результат для конкретной ситуации.
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
в любом случае распечатывает, если вы избегаете всех знаков доллара.
Я позволил себе сменить галочку на $()
для удобочитаемости и универсальности.
Если вы используете метод Нагула (включая двойные кавычки для внешних) и $()
вместо кавычек все, что вам нужно - это знаки доллара.
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"
Который делает для запоминающегося и очень последовательного метода.
Как бы вы использовали значение, полученное из awk, и сохранили его как переменную? Это то, с чего я начинаю.
alias xx2='xrandr | awk '\''$2=="connected"{s=$1} END{print s}'\'''
Это то, что я пытаюсь сделать.
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;
Это была моя первая идея. Я видел, что это не присваивает значение VAR после того, как я пытаюсь открыть OMG.
alias xx2='VAR=$(xrandr | awk '\''$2=="connected"{s=$1} END{print s}'\''); echo $VAR > OMG'