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

cfi*_*her 4 linux bash alias awk command-line

我想将以下命令行序列保存为 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
Run Code Online (Sandbox Code Playgroud)

它在命令行中运行良好,但当我尝试将其设置为别名时失败。我尝试将以下内容添加到 .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"
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

-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
Run Code Online (Sandbox Code Playgroud)

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

A D*_*arf 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; }
Run Code Online (Sandbox Code Playgroud)

这完全可以作为别名使用。


Jon*_*ler 5

坦率地说,当一个命令变得那么大时,我会把它变成一个脚本而不是别名。脚本的一个优点是您可以让它处理更多的文件,而不仅仅是“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'
Run Code Online (Sandbox Code Playgroud)