【问题标题】:Linux head/tail with offset带偏移的 Linux 头/尾
【发布时间】:2014-10-07 12:20:12
【问题描述】:

在 Linux 中有没有一种方法可以请求头部或尾部,但需要忽略额外的记录偏移量。

例如,如果文件example.lst 包含以下内容:

row01
row02
row03
row04
row05

我使用 head -n3 example.lst 可以获得第 1 - 3 行,但如果我希望它跳过第一行并获得第 2 - 4 行怎么办?

我问是因为某些命令的标题可能在搜索结果中并不理想。例如du -h ~ --max-depth 1 | sort -rh 将返回主目录中所有文件夹的目录大小,按降序排序,但会将当前目录附加到结果集的顶部(即~)。

Head 和 Tail 手册页似乎没有任何偏移参数,所以也许有某种range 命令可以指定所需的行:例如range 2-10 什么的?

【问题讨论】:

    标签: linux bash shell command-line command


    【解决方案1】:

    来自man tail

       -n, --lines=K
            output the last K lines, instead of the last 10; 
            or use -n +K to output lines starting with the Kth
    

    因此,您可以使用 ... | tail -n +2 | head -n 3 从第 2 行开始获取 3 行。

    非头/尾方法包括sed -n "2,4p"awk "NR >= 2 && NR <= 4"

    【讨论】:

    • +1 你也可以awk 'NR>4{exit}NR>=2' 在第四行之后退出。
    • wtf 这个答案毫无意义——我们如何使用headtail 来获取范围。我希望这个答案中有一个例子,比如tail -n 5 -l 5 第一个选项是从哪里开始第二个是多少
    • @MrCholo 答案解释了如何,但如果不清楚,你可以给我一个行范围,我会给你头+尾组合来提取它
    • 好吧,我知道如果你这样做:tail -n 10 | head -n 5,它将读取“倒数第二组 5”,但是,想象一个更大的数字。 tail -n 1000 | head -n 5,现在它必须读取 1000 条速度较慢的东西。我正在寻找一个可以执行此操作且仅读取 5 行的命令。类似range --start '-1000' --end '-1005',注意负数
    • 文件不可行寻址。如果您想按行号访问行而不从头或尾读取文件,则必须提前索引文件,或使所有行的长度已知。
    【解决方案2】:

    要获取 2 到 4 之间的行(包括两者),您可以使用:

    head -n4 example.lst | tail -n+2
    

    head -n4 example.lst | tail -n3
    

    【讨论】:

      【解决方案3】:

      花了很多时间才最终得到这个解决方案,它似乎是唯一一个涵盖所有用例的解决方案(到目前为止):

      command | tee full.log | stdbuf -i0 -o0 -e0 awk -v offset=${MAX_LINES:-200} \
                '{
                     if (NR <= offset) print;
                     else {
                         a[NR] = $0;
                         delete a[NR-offset];
                         printf "." > "/dev/stderr"
                         }
                 }
                 END {
                   print "" > "/dev/stderr";
                   for(i=NR-offset+1 > offset ? NR-offset+1: offset+1 ;i<=NR;i++)
                   { print a[i]}
                 }'
      

      功能列表:

      • head 的实时输出(显然 tail 是不可能的)
      • 不使用外部文件
      • stderr 上的进度条,MAX_LINES 之后的每一行一个点,对于长时间运行的任务非常有用。
      • 避免由于缓冲 (stdbuf) 而导致的错误记录顺序

      【讨论】:

        【解决方案4】:

        sed -n 2,4p somefile.txt

        #填充

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-11-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多