Bash:使用sed或awk读取文件场景中的行
我有以下几种情况: 文件内容:Bash:使用sed或awk读取文件场景中的行,bash,ubuntu-12.04,shell,sed,awk,Bash,Ubuntu 12.04,Shell,Sed,Awk,我有以下几种情况: 文件内容: 10.1.1.1 10.1.1.2 10.1.1.3 10.1.1.4 我想要sed或awk,以便在每次返回新行时对文件进行cat 像 第一次迭代: cat ip | some magic 10.1.1.1 Second iteration returns 10.1.1.2 Third iteration returns 10.1.1.3 Fourth iteration returns 10.1.1.4 在n次迭代之后,它返回到第1行 第五次迭代返回:
10.1.1.1
10.1.1.2
10.1.1.3
10.1.1.4
我想要sed或awk,以便在每次返回新行时对文件进行cat
像
第一次迭代:
cat ip | some magic
10.1.1.1
Second iteration returns
10.1.1.2
Third iteration returns
10.1.1.3
Fourth iteration returns
10.1.1.4
在n次迭代之后,它返回到第1行
第五次迭代返回:
10.1.1.1
我们可以用sed或awk来完成吗。你不能用cat来完成。你也不能在管道上搜索,所以你不能使用管道 您可以使用嵌套的while循环来实现这一点
while ((1))
do
while read line
do
echo "$line"
done <somefile
done
while((1))
做
读行时
做
回音“$line”
完成您需要将行号存储在文件中,并在每次调用时用模数递增
get_line () {
if [[ ! -e /var/local/get_line.next ]]
then
if [[ ! -e /var/local ]]
then
mkdir -p /var/local
fi
line_no=1
else
line_no=$(< /var/local/get_line.next)
fi
file_length=(wc -l < ip_file)
if ((file_length == 0))
then
echo "Error: Data file is empty" >&2
return 1
fi
if ((line > file_length))
then
line=1
fi
sed -n "$line_no{p;q}" ip_file
echo "$((++line_no))" > /var/local/get_line.next
}
get_行(){
如果[!-e/var/local/get_line.next]]
然后
如果[!-e/var/local]]
然后
mkdir-p/var/local
fi
第1行
其他的
行号=$(&2
返回1
fi
如果((行>文件长度))
然后
直线=1
fi
sed-n“$line_no{p;q}”ip_文件
echo“$(++line_no))”>/var/local/get_line.next
}
这是一个函数的形式,您可以将其合并到脚本中。请随意更改get_line.next文件的位置。请注意,如果需要,读取或写入文件或创建目录的权限必须正确
您不需要使用cat
是否有指定sed
或awk
的原因,或者是否可以接受另一种语言的解决方案?该解决方案以无限循环方式输出文件,相当于较短的while((1));做一些档案;完成
。请注意,while((1))
也可以写入while true
或while:
。你几乎应该总是把-r
和读@denniswillamson一起作为一种教育<代码>While((1));做一些档案;done
与echo不太一样$file可以替换为do_something_有用,这符合OPs要求“在n次迭代后返回第1行”。