Remove blank lines with grep

TextTerminalGrepNewline

Text Problem Overview


I tried grep -v '^$' in Linux and that didn't work. This file came from a Windows file system.

Text Solutions


Solution 1 - Text

Try the following:

grep -v -e '^$' foo.txt

The -e option allows regex patterns for matching.

The single quotes around ^$ makes it work for Cshell. Other shells will be happy with either single or double quotes.

UPDATE: This works for me for a file with blank lines or "all white space" (such as windows lines with \r\n style line endings), whereas the above only removes files with blank lines and unix style line endings:

grep -v -e '^[[:space:]]*$' foo.txt

Solution 2 - Text

Keep it simple.

grep . filename.txt

Solution 3 - Text

Use:

$ dos2unix file
$ grep -v "^$" file

Or just simply awk:

awk 'NF' file

If you don't have dos2unix, then you can use tools like tr:

tr -d '\r' < "$file" > t ; mv t "$file"

Solution 4 - Text

grep -v "^[[:space:]]*$"

The -v makes it print lines that do not completely match

===Each part explained===
^             match start of line
[[:space:]]   match whitespace- spaces, tabs, carriage returns, etc.
*             previous match (whitespace) may exist from 0 to infinite times
$             match end of line

Running the code-

$ echo "
> hello
>       
> ok" |
> grep -v "^[[:space:]]*$"
hello
ok

To understand more about how/why this works, I recommend reading up on regular expressions. http://www.regular-expressions.info/tutorial.html

Solution 5 - Text

The same as the previous answers:

grep -v -e '^$' foo.txt

Here, grep -e means the extended version of grep. '^$' means that there isn't any character between ^(Start of line) and $(end of line). '^' and '$' are regex characters.

So the command grep -v will print all the lines that do not match this pattern (No characters between ^ and $).

This way, empty blank lines are eliminated.

Solution 6 - Text

If you have sequences of multiple blank lines in a row, and would like only one blank line per sequence, try

grep -v "unwantedThing" foo.txt | cat -s

cat -s suppresses repeated empty output lines.

Your output would go from

match1



match2

to

match1

match2

The three blank lines in the original output would be compressed or "squeezed" into one blank line.

Solution 7 - Text

I prefer using egrep, though in my test with a genuine file with blank line your approach worked fine (though without quotation marks in my test). This worked too:

egrep -v "^(\r?\n)?$" filename.txt

Solution 8 - Text

Do lines in the file have whitespace characters?

If so then

grep "\S" file.txt

Otherwise

grep . file.txt

Answer obtained from: https://serverfault.com/a/688789

Solution 9 - Text

This code removes blank lines and lines that start with "#"

 grep -v "^#" file.txt | grep -v ^[[:space:]]*$

Solution 10 - Text

awk 'NF' file-with-blank-lines > file-with-no-blank-lines

Solution 11 - Text

I tried hard, but this seems to work (assuming \r is biting you here):

printf "\r" | egrep -xv "[[:space:]]*"

Solution 12 - Text

It's true that the use of grep -v -e '^$' can work, however it does not remove blank lines that have 1 or more spaces in them. I found the easiest and simplest answer for removing blank lines is the use of awk. The following is a modified a bit from the awk guys above:

awk 'NF' foo.txt

But since this question is for using grep I'm going to answer the following:

grep -v '^ *$' foo.txt

Note: the blank space between the ^ and *.

Or you can use the \s to represent blank space like this:

grep -v '^\s*$' foo.txt

Solution 13 - Text

Use:

grep pattern filename.txt | uniq

Solution 14 - Text

Using Perl:

perl -ne 'print if /\S/'

\S means match non-blank characters.

Solution 15 - Text

Here is another way of removing the white lines and lines starting with the # sign. I think this is quite useful to read configuration files.

[root@localhost ~]# cat /etc/sudoers | egrep -v '^(#|$)'
Defaults    requiretty
Defaults   !visiblepw
Defaults    always_set_home
Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR
LS_COLORS"
root    ALL=(ALL)       ALL
%wheel  ALL=(ALL)       ALL
stack ALL=(ALL) NOPASSWD: ALL

Solution 16 - Text

egrep -v "^\s\s+"

egrep already do regex, and the \s is white space.

The + duplicates current pattern.

The ^ is for the start

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionnode ninjaView Question on Stackoverflow
Solution 1 - TextarsView Answer on Stackoverflow
Solution 2 - TextFrej ConnollyView Answer on Stackoverflow
Solution 3 - Textghostdog74View Answer on Stackoverflow
Solution 4 - TextSeperoView Answer on Stackoverflow
Solution 5 - TextFatherMathewView Answer on Stackoverflow
Solution 6 - TextSenol ErdoganView Answer on Stackoverflow
Solution 7 - TextchryssView Answer on Stackoverflow
Solution 8 - TextjspekView Answer on Stackoverflow
Solution 9 - TextFederico AlemanyView Answer on Stackoverflow
Solution 10 - TextTimView Answer on Stackoverflow
Solution 11 - TextmvdsView Answer on Stackoverflow
Solution 12 - TextMarcTView Answer on Stackoverflow
Solution 13 - TextbaitisjView Answer on Stackoverflow
Solution 14 - TextMajid AzimiView Answer on Stackoverflow
Solution 15 - Textlauc.exon.nodView Answer on Stackoverflow
Solution 16 - TextJonni2016aaView Answer on Stackoverflow