【1】Shell脚本:while read line无法读取最后一行的问题

刚刚利用shell脚本处理日志文件时,发现了一个问题:while read line无法读取到最后一行

通过编辑器可以看到待处理的文件是5243行,但是,脚本的计数值却只打印了5242次。

shell脚本源码如下:

 icount=0
while read line
do
data=`echo ${line#*error repeat sdr }`
callid=`echo ${data% error:mysql.*}`
let icount++
echo "${icount}"
echo "${callid}" >> 2019-02-26-callid-test.txt
done < 2019-02-26-errorrepeat.txt

如上脚本。

【2】解决方案

方案一:

在利用while read line读取文件时:

如果文件最后一行之后没有换行符\n,则read读取最后一行时遇到文件结束符EOF,循环即终止。

虽然,此时$line内存有最后一行,但程序已经没有机会再处理此行内容。因此导致了这个问题发生。解决方案如下:

 while read line || [[ -n ${line} ]]

这样当文件没有到最后一行时不会测试-n $line,当遇到文件结束(最后一行)时,仍然可以通过测试$line是否有内容来进行继续处理。

上例子代码如下改进:

 icount=0
while read line || [[ -n ${line} ]]
do
data=`echo ${line#*error repeat sdr }`
callid=`echo ${data% error:mysql.*}`
let icount++
echo "${icount}"
echo "${callid}" >> 2019-02-26-callid-test.txt
done < 2019-02-26-errorrepeat.txt

方案二:

通过分析原因可知,本质原因是因为文件格式不是unix导致的,也可以直接通过设置文件格式来处理。

如这样处理,脚本代码不需改动。

查询文件格式和修改文件格式为unix,可参见随笔《/usr/bin/python^M: 解释器错误: 没有那个文件或目录

Good Good Study, Day Day Up.

顺序 选择 循环 总结

Shell脚本:while read line无法读取最后一行的问题的更多相关文章

  1. Shell 脚本(四) ”read 读取控制台输入” 与 “函数”

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 八.read 读取控制台输入 1.基本语法 read(选项)(参数) 选项: -p: 指定读取值时的提示 ...

  2. shell脚本while read line的使用

    #### 题目要求计算文档a.txt中每一行中出现的数字个数并且要计算一下整个文档中一共出现了几个数字.例如a.txt内容如下:12aa*lkjskdjalskdflkskdjflkjj我们脚本名字为 ...

  3. Shell 脚本报错 line x: [xxx: command not found

    [root@VM-0-6-centos sh_scripts]# bash val.sh username: hello world! val.sh: line 5: [hello: command ...

  4. Shell脚本编程具体解释

    第12章 Shell脚本编程   l  Shell命令行的执行 l  编写.改动权限和运行Shell程序的步骤 l  在Shell程序中使用參数和变量 l  表达式比較.循环结构语句和条件结构语句 l ...

  5. 编写Shell脚本

    1.脚本的编写 Shell脚本本身是一个文本文件,这里编写一个简单的程序,在屏幕上显示一行helloworld! 脚本内容如下: #!/bin/bash #显示“Hello world!" ...

  6. shell脚本 入门 —— 符号篇

    shell Shell就是一个命令行解释器,它的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive). Shell还有一种执行命令的方式称 ...

  7. shell脚本基础知识

    虽然现在能在Linux系统下生存,但是自觉效率太低,和高手有很大的差距. 这就是关于Linux的知识太过匮乏,有很多事情知道该怎么做,但是就是没法在Linux下实现,为了提升工作效率,必须要接触Lin ...

  8. shell脚本实现读取一个文件中的某一列,并进行循环处理

    shell脚本实现读取一个文件中的某一列,并进行循环处理 1) for循环 #!bin/bash if [ ! -f "userlist.txt" ]; then echo &qu ...

  9. 读取系统执行状态的shell脚本

    近期在学习shell.老大让写一个读取系统配置信息的脚本当作练习和工作验收,我就写了这么一个脚本,读取操作系统,内核,网卡,cpu,内存,磁盘等信息,目的是让看的人一眼就能看出这台机子的配置以及眼下的 ...

随机推荐

  1. SpringBoot------自动装配Mapper报错

    如图: 解决方法: 转载: https://blog.csdn.net/j754379117/article/details/71639043

  2. Centos7 php-fpm root 运行,执行 kill 等系统命令

    Centos7 php-fpm root 运行,执行 kill 等系统命令 前提 当前系统安装的是宝塔环境,PHP的环境在如下的目录: /www/server/php/72/etc 1 修改 php- ...

  3. N - Asteroids

    Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x N g ...

  4. mybatis06--动态sql

    1.if标签 public interface StudentDao { /** *动态sql的查询 参数是Student对象 不确定 用户输入几个属性值 */ List<Student> ...

  5. Git查看两个版本之间修改了哪些文件

    gdiff 63e3b647d55fcc643e793e650c893be8601719b1 548cdaf01dbc2f08d1ca0b697a24afe512b75a2f --stat git l ...

  6. map里面的set方法

    let a=[1,2,3,4,1,2,3,4,1,4];let b= new Set(a);console.log(b) 还有add方法介绍下: let a=new Set();let b=[1,1, ...

  7. VM装mac10.9教程+报错信息解决办法

    VM装mac10.9教程+报错信息解决办法 教程1: 教你在Vmware 10下安装苹果Mac10.9系统 地址:http://tieba.baidu.com/p/2847457021 教程2: VM ...

  8. libvirt虚拟库

    转载自:https://www.ibm.com/developerworks/cn/linux/l-libvirt/index.html Libvirt 虚拟化库剖析   讲到向外扩展计算(比如云计算 ...

  9. 17.4-uC/OS-III消息管理(任务消息队列使用)

    任务消息队列跟任务信号量一样,均隶属于某一个特定任务, 不需单独创建,任务在则在, 只有该任务才可以接收这个任务消息队列的消息,其他任务只能给这个任务消息队列发送消息, 却不能接收.任务消息队列与(普 ...

  10. jdbc--取大量数据

    最近使用jdbc方式查询数据,保存为csv文件中.当然你可以在pl/sql中直接查出来,copy to excel就好了.但我想通过程序实现 @Test public void test() thro ...