问题
In count (non-blank) lines-of-code in bash they explain how to count the number of non-empty lines.
But is there a way to count the number of blank lines in a file? By blank line I also mean lines that have spaces in them.
回答1:
Another way is:
grep -cvP '\S' file
-P '\S'(perl regex) will match any line contains non-space-vselect non-matching lines-cprint a count of matching lines
If your grep doesn't support -P option, please use -E '[^[:space:]]'
回答2:
One way using grep:
grep -c "^$" file
Or with whitespace:
grep -c "^\s*$" file
回答3:
You can also use awk for this:
awk '!NF {sum += 1} END {print sum}' file
From the manual, "The variable NF is set to the total number of fields in the input record". Since the default field separator is the space, any line consisting in either nothing or some spaces will have NF=0.
Then, it is a matter of counting how many times this happens.
Test
$ cat a
aa dd
ddd
he llo
$ cat -vet a # -vet to show tabs and spaces
aa dd$
$
ddd$
$
^I$
he^Illo$
Now let's' count the number of blank lines:
$ awk '!NF {s+=1} END {print s}' a
3
回答4:
grep -cx '\s*' file
or
grep -cx '[[:space:]]*' file
That is faster than the code in Steve's answer.
回答5:
Using Perl one-liner:
perl -lne '$count++ if /^\s*$/; END { print int $count }' input.file
回答6:
grep -v '\S' | wc -l
(On OSX the Perl expressions are not available, -P option)
回答7:
To count how many useless blank lines your colleague has inserted in a project you can launch a one-line command like this:
blankLinesTotal=0; for file in $( find . -name "*.cpp" ); do blankLines=$(grep -cvE '\S' ${file}); blankLinesTotal=$[${blankLines} + ${blankLinesTotal}]; echo $file" has" ${blankLines} " empty lines." ; done; echo "Total: "${blankLinesTotal}
This prints:
<filename0>.cpp #blankLines
....
....
<filenameN>.cpp #blankLines
Total #blankLinesTotal
来源:https://stackoverflow.com/questions/13506109/count-number-of-blank-lines-in-a-file