Shell脚本实现C语言代码行数统计

 更新时间:2015年05月11日 09:18:00   投稿:junjie  
这篇文章主要介绍了Shell脚本实现C语言代码行数统计,本文直接给出实现代码,需要的朋友可以参考下

写了一个比较粗糙的C语言代码行数统计脚本,目前还有些bug,而且效率也不高。脚本主要就是去除大部分的注释后统计行数,相当于做了一部分预处理的工作。下面是代码:

#!/bin/bash 

filename=$1
echo "`whoami`"
if [ $# -lt 1 ];then
 echo "usage : ./scripts filename"
 exit -1
fi

if [ ! -f $filename ];then
 echo "$filename is not a file"
 exit 0;
fi 

user="`whoami`"
if [ "$user" != "root" ];then
 echo "use scripts with root"
 exit 0;
fi

#删除空行,空行包括:tables + space
sed '/^[[:blank:]]*$/d' $filename > "${filename}_backup"

#删除 // 所在的行
sed -i '/^[[:blank:]]*\/\//d' "${filename}_backup"

#/*xxxxx*/
#打印/*所有的开始行
grep -n '[[:blank:]]*/[*]' "${filename}_backup" | awk 'BEGIN{FS=":"}{print $1}' > "start.txt"
#打印*/所有的结束行
grep -n '[*]/[[:blank:]]*' "${filename}_backup" | awk 'BEGIN{FS=":"}{print $1}' > "end.txt"

#合并两个文件,final.txt里面每行就是/*xx....\n....xx*/这种类型注释的开始行和起始行号
paste "start.txt" "end.txt" > "final.txt"

while read line
do
 #得到起始行
 START=`echo "$line" | awk 'BEGIN{FS="\t"}{print $1}'`
 #得到结束行
 END=`echo "$line" | awk 'BEGIN{FS="\t"}{print $2}'`
 #这里有一个bug,如是/*xxxx*/中的/*和*/在同一行出现,并且有代码也在同一行
 # printf("hello world\n"); /*打印字符串*/ 
 # /*打印字符串*/
 #上面两种情况的就没法判断,希望大家优化
 if [ $START -eq $END ];then
 continue
 fi
 #删除/*到*/中间所有行
 sed -i "${START},${END}d" "${filename}_backup"
done < "final.txt"

wc -l "${filename}_backup"
rm -f "final.txt" "start.txt" "end.txt"

脚本只能实现大概的代码行数的统计,不能做到精确统计!
因为没有做很多的测试,而且也不排除有些比较少见的注释我没考虑到,另外脚本的效率也比较差,用了很多tmp文件。
所以希望大家多提提意见!

相关文章

  • Linux 文件查找打包压缩及解压命令详解

    Linux 文件查找打包压缩及解压命令详解

    这篇文章主要介绍了Linux 文件查找,打包压缩及解压,文件查找和压缩解压是Linux系统中非常常见的操作,掌握了相关命令和技巧,可以提高我们的工作效率和文件管理能力,需要的朋友可以参考下
    2023-11-11
  • shell在指定目录下批量执行sql脚本的实例

    shell在指定目录下批量执行sql脚本的实例

    今天小编就为大家分享一篇shell在指定目录下批量执行sql脚本的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • linux链接编译详解

    linux链接编译详解

    通过自己编写Makefile文件来实现多目标文件的链接,其实就是将gcc 编译命令写入到Makefile文件,通过执行make 指令来实现编译。这样我不需要每次都敲入gcc -指令。直接输入make就OK了。
    2014-02-02
  • 详解TCP的四种定时器

    详解TCP的四种定时器

    这篇文章主要介绍了详解TCP的四种定时器的相关资料,需要的朋友可以参考下
    2017-07-07
  • linux 下获取当前工作路径的实例

    linux 下获取当前工作路径的实例

    今天小编就为大家分享一篇linux 下获取当前工作路径的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • Cygwin下安装vim后,vim中退格键无法正常使用的解决方法

    Cygwin下安装vim后,vim中退格键无法正常使用的解决方法

    下面小编就为大家带来一篇Cygwin下安装vim后,vim中退格键无法正常使用的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • 利用expect命令实现Shell自动化交互的方法详解

    利用expect命令实现Shell自动化交互的方法详解

    我们通过Shell可以实现简单的控制流功能,如:循环、判断等。下面这篇文章主要给大家介绍了关于利用expect命令实现Shell自动化交互的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-12-12
  • Linux查看端口占用lsof -i:port的方法

    Linux查看端口占用lsof -i:port的方法

    下面小编就为大家带来一篇Linux查看端口占用lsof -i:port的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • jar包重启shell脚本问题记录

    jar包重启shell脚本问题记录

    工作中经常需要重启jar包,这里写一个restart.sh文件,记录一下,对shell脚本重启jar包知识感兴趣的朋友一起看看吧
    2024-02-02
  • linux中编写自己的并发队列类(Queue 并发阻塞队列)

    linux中编写自己的并发队列类(Queue 并发阻塞队列)

    这篇文章主要介绍了linux中编写并发队列类,功能有:并发阻塞队列、有超时限制、有大小限制
    2013-12-12

最新评论