AWK别名不打印

时间:2017-02-24 03:43:52

标签: bash awk

下面的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。我在这里缺少什么?

2 个答案:

答案 0 :(得分:3)

不要使用别名。它们需要额外的引用层,这很麻烦(如此处所示),它们会阻止您对代码进行有用的参数化或添加条件逻辑。

对函数的简单音译是:

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]}'
}

答案 1 :(得分:1)

我认为bash对3美元和0美元存在混淆,认为它们是别名的论点。你可以通过验证 在bash中尝试这个

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

它只会打印

  

{print}

但现在尝试

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

它将打印您的预期

  

{print $ 3}

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