I want to grep smb.conf and see only lines which are not commented.

grep "^[^#;]" smb.conf

The first ^ refers to the beginning of the line, so lines with comments starting after the first character will not be excluded. [^#;] means any character which is not # or ;.

In other words, it reports lines that start with any character other than # and ;. It's not the same as reporting the lines that don't start with # and ; (for which you'd use grep -v '^[#;]') in that it also excludes empty lines, but that's probably preferable in this case as I doubt you care about empty lines.

If you wanted to ignore leading blank characters, you could change it to:

grep '^[[:blank:]]*[^[:blank:]#;]' smb.conf


grep -vxE '[[:blank:]]*([#;].*)?' smb.conf


awk '$1 ~ /^[^;#]/' smb.conf
  • right answer is: cat /etc/samba/smb.conf | grep ^[^#\;] But anyway Thank you – denys Jan 11 '13 at 20:09
  • Yeah, or you could use "quotes"; I edited that in subsequently. – goldilocks Jan 11 '13 at 20:11
  • 7
    @denys You're wrong: goldilocks's response in not worst than your. .1 Please avoid using cat ...| syntax!. .2 For whipping empty lines AND lines containing only space, maybe with comments U could use this: grep -v "^ *\(#.*\|\)$" < smb.conf – F. Hauri Jan 11 '13 at 20:14
  • 8
    @EmanuelBerg It's an useless fork. cat file | grep "blah" implie running two binaries through a fifo, while grep "blah" <file do exactly same and bind file naturaly to grep's STDIN . [bash] useless cat is a full featured subject of search through any search engine! -> blog.sanctum.geek.nz/useless-use-of-cat ... for sample – F. Hauri Jan 11 '13 at 22:01
  • 2
    It doesn't do exactly the same. It creates 2 processes and a pipe where 1 process is enough. Read the link given in @F.Hauri's last comment. – rahmu Jan 11 '13 at 22:12

Vim solution:


I stumbled across this question when trying to find the vim solution myself.

  • 1
    This would also delete lines that starts with blanks. – Kusalananda Jun 7 '19 at 14:57
  • True. I found that useful for config files as lines between comments otherwise fill up the output. If you'd rather keep the blank lines, change the * to + like so: v/^\s+[#\n]/p – David Lord Jun 8 '19 at 23:27

The pipe to grep in oliver nadj's answer may be eliminated by (assuming GNU grep or compatible):

grep -v "^\s*[#\;]\|^\s*$" <some_conf_file>
  • Second grep i@nadj's looks useless , @goldilocks's answer was more than eough. – Archemar Oct 13 '15 at 9:19
  • 1
    I agree that goldilocks's answer was correct. However, I also considered it useful to not show empty lines. – Morten Lind Oct 13 '15 at 17:41

These examples might be of use to people.

[user@host tmp]$ cat whitespacetest
# Line 1 is a comment with hash symbol as first char

# Line 2 is a comment with hash symbol as second char
  # Line 3 is a comment with hash symbol as third char
        # Line 4 is a comment with tab first, then hash
        ; Line 5 is a comment with tab first, then semicolon. Comment char is ;
; Line 6 is a comment with semicolon symbol as first char
[user@host tmp]$

The first grep example excludes lines beginning with any amount of whitespace followed by a hash symbol.

[user@host tmp]$ grep -v '^[[:space:]]*#' whitespacetest

        ; Line 5 is a comment with tab first, then semicolon. Comment char is ;
; Line 6 is a comment with semicolon symbol as first char
[user@host tmp]$

The second excludes lines beginning with any amount of whitespace followed by a hash symbol or semicolon.

[user@host tmp]$ grep -v '^[[:space:]]*[#;]' whitespacetest

[user@host tmp]$
grep -v "^\s*[#;]" any.conf | grep -v "^\s*$"

that is what works for me. ignore commented or empty lines, even whitespace before hash mark or semicolon


Here i got better one (assuming GNU grep or compatible):

grep -v '^[#;/%<]\|^\s*$' anyfile.conf

exclude for lines which begins with #;/%< which are in square brackets and the second filter after pipe is \s*$ for blank lines.

  • 2
    In what type of conf files are < or / used for comments? I know a lot of conf file formats where < is everything but a comment. ! is sometimes used like in X resource files. – Stéphane Chazelas Mar 16 '17 at 10:42
grep -v '^$\|^\s*#' temp

This one's a lot better, I got it from https://stackoverflow.com/questions/17392869/how-to-print-a-file-excluding-comments-and-blank-lines-using-grep-sed

It assumes GNU grep or compatible.

  • The question also considers lines starting with ; as a comment that should be removed. – Kusalananda Jun 7 '19 at 14:56
egrep -v "^#|^$" anyfile.txt

this command is to grep all info in file excluding comments and blank lines.

  • 2
    Notice that smb.conf also comments with ; – Jeff Schaller Jul 11 '19 at 18:41

This should display you the file without those lines that begin with #: grep -v "^#" filename

  • This does nothing to lines starting with ;. – Kusalananda Jun 7 '19 at 14:56

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.