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