下面的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。我在这里缺少什么?
答案 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}
如果这可以解决您的问题,请告诉我