【问题标题】:AWK alias not printingAWK 别名不打印
【发布时间】:2017-02-24 12:01:46
【问题描述】:

下面的 awk 命令(从 stackoverflow 复制和粘贴)在命令行中可以正常工作,但在别名时不打印任何内容

 awk '/WORD/ {print $3}' log.log | awk 'BEGIN{c=0} length($0){a[c]=$0;c++}END{p5=(c/100*5); p5=p5%1?int(p5)+1:p5; print a[c-p5-1]}'

alias getperc="awk '/WORD/ {print \$3}' log.log | awk 'BEGIN{c=0} length(\$0){a[c]=$0;c++}END{p5=(c/100*5); p5=p5%1?int(p5)+1:p5; print a[c-p5-1]}'"

我对使用 bash 还是很陌生。我在这里错过了什么?

【问题讨论】:

  • 显示别名的正确定义,即alias myAlias="...."。 \ 无论如何,别名是一个非常有限的工具。研究如何将 awk 脚本安装为函数。祝你好运。
  • awk 通过管道传递到awk 通常表示有问题;你应该只有一个awk,可能。使用别名意味着您无法更改扫描的文件名,因此别名不是很灵活——如果您真的要经常使用它以提高速度,您最好使用脚本(或函数)很重要,但在我看来,这种情况极不可能发生)。
  • 双引号中的$ 反斜杠。

标签: bash awk


【解决方案1】:

不要使用别名。它们需要额外的引用层,这很麻烦(如此处),并且它们使您无法有效地参数化或将条件逻辑添加到代码中。

函数的简单音译是:

getperc() { awk '/WORD/ {print $3}' log.log | awk 'BEGIN{c=0} length($0){a[c]=$0;c++}END{p5=(c/100*5); p5=p5%1?int(p5)+1:p5; print a[c-p5-1]}'; }

功能稍强一些,默认情况下仍将使用log.log,但它还允许您提供备用输入文件名(如getperc alternate.log)或管道到您的函数(如cat alternate.log | getperc) :

getperc() {
  [[ -t 0 || $1 ]] || set -- - # use "-" (stdin) as input file if not a TTY
                               # ...this will let you pipe to your function.
  awk '/WORD/ {print $3}' "${1:-log.log}" | awk 'BEGIN{c=0} length($0){a[c]=$0;c++}END{p5=(c/100*5); p5=p5%1?int(p5)+1:p5; print a[c-p5-1]}'
}

【讨论】:

  • 现在这很简洁......可能会让我成为函数的信徒。谢谢
【解决方案2】:

我认为 bash 对 $3 和 $0 存在混淆,它认为它们是别名的参数。您可以通过以下方式验证这一点 在 bash 中试试这个

alias ech="echo {print \$3}"

它只会打印

{打印}

现在试试

alias ech="echo {print \$\3}"

它会打印出你所期望的

{打印 $3}

如果这能解决您的问题,请告诉我

【讨论】:

  • 不是别名的参数,确切地说。您会注意到,当使用t hello 调用时,使用alias t=$'printf \'1=%s\n2=%s\n\' "$1"' 定义的别名将打印1=2=hello,这表明$1 是空的,尽管显式传递了一个参数。它在调用交互式 shell 的上下文中扩展了 $1$2,除非有人之前运行过类似 set -- one two 的东西,否则它们几乎都是空的。
  • 是的,查尔斯我错了,这不是别名的论点。
  • @CharlesDuffy 但解决方案/根本原因是正确的。你对此有何看法?
  • 根本原因是正确的这是事实,但这并不是我特别碰巧有意见的事实。
  • 不过,经过片刻的思考,我设法形成了一个观点:虽然我对别名的立场可以归结为一个论点,即它们几乎从来都不是一个合适的工具,因为这样答案与正确转义双引号字符串中的内容一样多,因为它是关于别名的,它教一些有用的东西,并且是对网站的有用补充。
猜你喜欢
  • 2018-07-12
  • 2011-01-02
  • 2018-10-25
  • 1970-01-01
  • 2017-04-18
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多