使用zsh,尝试创建一个函数只打印任何管道输入的前n行

时间:2016-07-29 15:50:14

标签: zsh

到目前为止,这是我的功能:

function tinput() {
  let counter=0
  tail -f $1 |{
    while read data; do
      if [ counter -gt ${2:2} ]
      then
        counter=0
      else
        printf "$data"
    counter=counter+1
      fi
    done
  }
}

这个函数用于显示前n行输出而不是整个事物,我对bash脚本(或其衍生物)很新。

目前它出错:

tinput:4: parse error: condition expected: counter

我认为这是因为我声明的counter变量不在循环范围内,因此它不存在,可能吗?

2 个答案:

答案 0 :(得分:1)

您只需使用repeat命令。

function tinput() {
  tail -f $1 | repeat ${2:-2} IFS= read -re
}

一些解释:

  1. 这是repeat循环的简短形式,因为正文中只有一个命令。 (长形式看起来像

    repeat ${2:-2} do
      IFS= read -re
    done
    
  2. repeat ${2:-2} do IFS= read -re; done。 )

    1. IFS= read -r确保逐行读取每一行,而不修剪任何前导或尾随空格,或处理输入中的任何反斜杠转义字符。

    2. -e选项使read将其输入回显到标准输出,而不将输入分配给变量。

答案 1 :(得分:0)

对我来说,用户@JNevill正在寻找一些东西。我建议使用:

tail -f $1 | head -${2}

其中$ 1是你的文件,$ 2是你想从顶部读取的行数。