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)
我究竟做错了什么????
我对 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)
这完全可以作为别名使用。
坦率地说,当一个命令变得那么大时,我会把它变成一个脚本而不是别名。脚本的一个优点是您可以让它处理更多的文件,而不仅仅是“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)