find和grep命令统计代码行数及原理

本文用到的Shell命令:

  • grep
  • find
  • wc
  • xargs
  • sort

用grep匹配文件内容

1
2
3
4
5
6
7
8
# 这条命令会把index.js内容全部输出来,因为每行都匹配
grep "" index.js

# 这条命令会把index.js非空行的内容输出来,"^$"匹配所有空行,-v表示翻转匹配,所以每个非空行被匹配并输出
grep -v "^$" index.js

# 这条命令会把当前目录和子目录下所有js文件非空行的内容输出来,-R表示递归子目录
grep -R -v "^$" **/*.js

用wc统计行数

1
2
# 通过管道将内容传递给wc,统计js代码行数
grep -R -v "^$" **/*.js wc -l

使用find过滤文件

1
2
# 使用find列出所有扩展名为m和h的文件,通过管道和xargs传递给grep,然后统计代码行数
find . -name "*.m" -or -name "*.h" xargs grep -v "^$" wc -l

xargs的作用:

  • xargs把find输出的内容转换为命令行参数传递给grep。例如find输出的内容是main.js \n test.js,则find输出的每一行(即每个文件)都会调用一次grep,也就是grep main.js, grep test.js,输出每个文件中匹配的内容,最后由wc计算总行数。
  • 如果不用xargs,grep会把find输出的文件列表当做要搜索的内容,最后统计的是文件列表的行数(只会调用一次grep),也就是文件的个数。

直接用find统计行数

直接用find也可以统计行数,但是只能统计文件中所有内容(包括空行)的行数,没有用grep那么灵活。

1
2
3
4
5
# 统计每个文件的行数和总行数,包含空行
find . -name "*.js" xargs wc -l

# 统计每个文件的行数和总行数,包含空行,最后按行数排序
find . -name "*.js" xargs wc -l sort -n