从bash脚本中的行号开始读取行

时间:2012-06-19 13:47:06

标签: linux bash sed grep

我正在尝试从bash中的特定行开始逐行读取文件。我已经使用while命令通过递增计数来读取文件的每一行。我可以从特定的线开始吗?

let count=0
declare -a ARRAY

while read LINE; do
ARRAY[$count]=$LINE 
vech=${ARRAY[$count]}
    if [...blah ..]
     then
    ...blah..
    fi 
sleep 2 
((count++)) 
done < filec.c 

欢迎任何建议或算法形式的帮助。

编辑:我正在尝试将行号作为变量传递。我正在使用特定模式,如果找到,应该从模式开始传递行号。

5 个答案:

答案 0 :(得分:13)

我会使用sed的{​​{3}}从特定的行号开始并打印到文件的末尾:

lineNumber=10
sed -n "$lineNumber"',$p' |
while read line; do
  # do stuff
done

或者,正如Fredrik建议的那样,使用awk

lineNumber=10
awk "NR > $lineNumber" |
while read line; do
  # do stuff
done

答案 1 :(得分:5)

这样的事情怎么样?

while read -r line
do
    echo "$line"
done < <(tail -n +number file.name)

它不兼容POSIX,但试试你的Bash。当然,在循环中用$ line做你想做的事 PS:使用您想要的数字行更改数字,使用文件名更改file.name。

答案 2 :(得分:2)

许多方法中的一些:http://mywiki.wooledge.org/BashFAQ/011

个人:

printf '%s\n' {1..6} | { mapfile -ts 3 x; declare -p x; }                  

另外,请勿使用全大写变量名称。

答案 3 :(得分:1)

保持柜台。要在某一行之后打印所有行,您可以这样做:

#!/bin/bash

cnt=0
while read LINE
do
    if [ "$cnt" -gt 5 ];
    then
        echo $LINE
    fi
    cnt=$((cnt+1))
done < lines.txt

或者,为什么不使用awk:

awk 'NR>5' lines.txt 

答案 4 :(得分:0)

只需读取一定数量的行,直到您想要的数字,并开始逻辑阅读其余部分。

没有办法节省“文本”文件,你不能跳过行而不实际读取它们。这些行由0x0a和可变长度分隔。因此,必须扫描每个分隔符并计数以达到某个“行号”。有噱头可以让你觉得你没有看过它们,但是你做到了。