对 awk 命令使用别名时出错

对 awk 命令使用别名时出错

我尝试将此别名添加到我的 .zshrc 但遇到错误。我尝试转义 ==、" 和 && 值,但仍然没有成功。我错过了什么?

alias broke="ssh -t [email protected] tail -f documents/dir/`date -u +%Y%m%d`.log | awk '$2=="ABC:" && int($5)>=26 || int($5)<=-26'"

答案1

  1. 您过早执行了命令替换,因为您的别名是使用双引号而不是单引号定义的,因此date当您的别名为定义的,不是在调用时;
  2. 您的 shell 将您的awk字段引用解释为 shell 位置参数并且
  3. 正在扩大它们当你的别名被定义时;
  4. awk永远不会看到周围的双引号,ABC:因此它被解释为未设置的awk变量ABC(即空字符串),后跟一个意外位置的不带引号的冒号,这可能会引发错误awk
  5. 作为额外的建议,你应该真正使用$(...)而不是`...`因为里面的引用规则更直观。

要设置包含命令替换和特殊字符的别名,您应该使用单引号进行设置。实际上,在使用别名时,您不会希望进行参数扩展。而不是当它被调用时。

您不能在单引号内嵌入单引号,但这并不重要,因为引号本身不是分隔符:

alias hassinglequotesembedded='echo "It'\''s not really too hard; current date when the alias is executed is $(date)"; echo '"'but the alias was set at $(date)'"

强烈建议进一步阅读 Stack Overflow 上有关引用类型的内容:

答案2

如果您要经常运行此操作而需要别名,那么如果您执行以下操作,几乎肯定会更好:

  1. 将其编写为 shell 脚本 - 迷失在嵌套引号中的可能性要小得多。

  2. scp它到/usr/local/bin远程服务器上(或路径中的其他位置)。或者一开始就把它写在那里。请记住使用 使其可执行chmod

  3. ssh只需在需要时 运行脚本即可。 。如果需要,您甚至可以将其放入别名中:ssh -t [email protected] myscript

    alias broke='ssh -t [email protected] myscript'

顺便说一句,使用$()而不是反引号。 $()更容易阅读,更容易嵌套而不会出现问题,并且不容易与单引号混淆。

答案3

对我来说这就像需要逃避$角色一样简单

不工作:

alias trim="awk '{$1=$1};1';"

解决方案:

alias trim="awk '{\$1=\$1};1';"

相关内容