在 Linux 上使用命令行作为 bash 别名时出错

在 Linux 上使用命令行作为 bash 别名时出错

我想将以下命令行序列保存为 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

我究竟做错了什么????

答案1

坦白说,当命令变得那么大时,我会把它变成一个脚本,而不是别名。脚本的一个优点是,你可以让它处理更多的文件,而不仅仅是“access.logs”。

该命令序列涉及单引号和反引号 - 这总是增添乐趣。通常,您最好使用$(command args)代替反引号。

当您使用双引号括住别名时,反引号内的命令将在创建别名时执行 - 除非 shell 在定义别名时有不同的解释方式。此外,$var表达式在双引号内进行求值,因此您的awk错误表明您在当前 shell 中没有参数。

因此,如果您必须使用别名,那么您可能需要在整个表达式周围使用单引号,另外对于表达式中出现的每个单引号,将其替换为序列 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'

答案2

我对 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; }

这实际上起到了别名的作用。

答案3

由于别名是在双引号内定义的,因此日期命令在定义别名时执行,$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

如何使用从 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;

这是我的第一个想法。当我尝试打开 OMG 后,我发现它没有为 VAR 分配任何值。

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

相关内容