shell怎么读取文件中的每一行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell怎么读取文件中的每一行相关的知识,希望对你有一定的参考价值。

#!/bin/sh
cat file |
while read kpi;do
echo "#################################"
echo "$kpi"
echo $kpi"="
#grep -Il $str logs/* || echo "-------"
done

按照以上代码,想以文件中的每以行作为关键字去目录中检索。但结果输出不正常。好像是kpi变量带了换行符。
试图在kpi后追加一个字符,得出的却是替换结果

#################################
VD10151
=D10151
#################################
yyjk_d02
=yjk_d02

为什么
echo "$kpi"
echo $kpi"="
会变成“=”号替换前边的字符?

这种情况我见过,可以很肯定地说,你的文件file是dos格式(可能是在Windows下面编辑过),需要首先转为unix格式。用dos2unix。

dos2unix file

然后再运行脚本就没问题了。

追问

用UE转过之后,字符串拼接没问题了,显示
#################################
yyjk_d02
yyjk_d02=

但grep的结果还是不正常
grep -Il $kpi logs/* || echo "-------"

匹配结果都是空的

追答

-ll 两个l是什么意思?

grep -Il $kpi logs/* || echo "-------"

匹配不成功,才输出"-------"。
$kpi建议加个引号 "$kpi"

追问

一个是i的大写,表示不区分大小写。
一个是L的小写,查询多文件时只输出包含匹配字符的文件名。

还是匹配不出来,输出"-------"

追答

logs目录请用绝对路径或写上相对路径./logs。
试试吧。

参考技术A 可以用以下格式 fileName是被读取文件
while read line
do
do something
done < fileName

Shell while循环语句中的陷阱

参考技术A 我们经常使用while来循环读取文件的每一行,并用文件中的数据对变量赋值,典型写法如下

结果显示两次value打印都是0,循环中的赋值没有起作用。问题出在这种while写法上,cat file |  while read 的意思是: 使用 cat 命令查看文件,通过管道将结果传送给包含 read 命令的 while 命令,会每次读取文件中的一行文本,传给read后的参数,参数可以为多个,默认以空格分隔,当文件中没有可读取的文本时,read 命令将以非零状态退出。 这就意味着while循环中的程序实际上是在一个子进程中执行的,当前进程通过管道将文件内容传递到子进程。循环体中的value并非是外部定义的value,在循环体中对value赋值自然也不能改变外部value的值。

解决方法是换一种读文件的方法,将循环体放到当前进程中执行。

cat file | while read 是一种很不友好的写法,虽然最常用,但是效果最差。 推荐使用以上<data.txt的读文件方法。

用上述cat | while写法读文件时还可能碰见另一个问题:读不到文件的最后一行。如data.txt文件的内容如下

用上述cat | while写法则可能只会读到222,最后一行333被忽视了。上文已经说到while如果判断没有可读取的文本时就会退出,while判断是否到达文件末尾是识别文件结束符EOF。文件最后一行之后如果没有换行符\n,则read读取最后一行时遇到EOF,循环即终止。此时虽在内存有最后一行,但程序已经没有机会再处理此行内容。

知道原因了就可以解决这个问题,权宜之计是在最后一行的后面再换个行。治标的方法是用dos2unix将文件格式转换为Unix,因为缺少换行符一般是由于Windows文件传到Linux没有转换格式。

Linux命令行真的是宝藏,功能丰富,用法多样。如果Linux的生态圈能够更发达一点,说不定以后Linux

会是家庭电脑的主流操作系统。

以上是关于shell怎么读取文件中的每一行的主要内容,如果未能解决你的问题,请参考以下文章

shell读取文件的每一行内容并输出

shell:读取文件的每一行内容并输出

通过shell脚本实现读取文件新增的每一行并追加到另一台服务器的文件末尾

C语言 怎么读取文件的每一行的内容

用python读取文本文件,对读出的每一行进行操作,这个怎么写?

Shell 代码 - 循环读取 CSV 文件并制作另一个