4

Я хочу сохранить следующую последовательность командной строки как псевдоним 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 ответов5

6

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

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

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'
4

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

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

3

Другим вариантом является использование одинарных кавычек для внешних и экранирование и цитирование внутренних. Вы можете выбрать, какой метод (этот или тот, что есть в ответе Нагула ) принесет наименьший уродливый результат для конкретной ситуации.

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"

Что делает метод запоминающимся и очень последовательным.

0

Как бы вы использовали значение, полученное из 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'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .