138

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

4

9 Answers 9

226
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

or

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

Or

awk '$1 ~ /^[^;#]/' smb.conf
13
  • 1
    right answer is: cat /etc/samba/smb.conf | grep ^[^#\;] But anyway Thank you
    – denys
    Jan 11, 2013 at 20:09
  • Yeah, or you could use "quotes"; I edited that in subsequently.
    – goldilocks
    Jan 11, 2013 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 Jan 11, 2013 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 Jan 11, 2013 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, 2013 at 22:12
5

Vim solution:

:v/^\s*[#\n]/p

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

2
  • 1
    This would also delete lines that starts with blanks.
    – Kusalananda
    Jun 7, 2019 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, 2019 at 23:27
5

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>
2
  • Second grep i@nadj's looks useless , @goldilocks's answer was more than eough.
    – Archemar
    Oct 13, 2015 at 9:19
  • 1
    I agree that goldilocks's answer was correct. However, I also considered it useful to not show empty lines. Oct 13, 2015 at 17:41
5

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]$
3
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

0

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.

1
  • 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. Mar 16, 2017 at 10:42
-1
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.

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

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

1
  • 3
    Notice that smb.conf also comments with ;
    – Jeff Schaller
    Jul 11, 2019 at 18:41
-3

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

1
  • This does nothing to lines starting with ;.
    – Kusalananda
    Jun 7, 2019 at 14:56

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .