Làm cách nào để grep các dòng không bắt đầu với dòng # # hoặc hay;


78

Tôi muốn grep smb.confvà chỉ xem những dòng không được bình luận.


1
testparmlàm điều này tốt hơn vì điều này cũng hiển thị các giá trị mặc định.
F. Hauri

@ F.Hauri Cảm ơn bạn. nó đang làm việc Nhưng nó cũng tạo ra một số thông tin không cần thiết (trong trường hợp của tôi), cũng nên được đưa vào ...
chối


Một cách khác thông qua PCRE grep stackoverflow.com/a/45917459/3297613
Avinash Raj

Câu trả lời:


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

Đầu tiên ^đề cập đến phần đầu của dòng, vì vậy các dòng có nhận xét bắt đầu sau ký tự đầu tiên sẽ không được loại trừ. [^#;]có nghĩa là bất kỳ nhân vật nào không #hoặc ;.

Nói cách khác, nó báo cáo các dòng bắt đầu bằng bất kỳ ký tự nào khác ngoài #;. Nó không giống như báo cáo các dòng không bắt đầu #;(mà bạn sử dụng grep -v '^[#;]') ở chỗ nó cũng loại trừ các dòng trống , nhưng có lẽ tốt hơn trong trường hợp này vì tôi nghi ngờ bạn quan tâm đến các dòng trống.

Nếu bạn muốn bỏ qua các ký tự trống hàng đầu, bạn có thể thay đổi nó thành:

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

hoặc là

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

Hoặc là

awk '$1 ~ /^[^;#]/' smb.conf

câu trả lời đúng là: cat /etc/samba/smb.conf | grep ^[^#\;]Nhưng dù sao cũng cảm ơn bạn
chối

Vâng, hoặc bạn có thể sử dụng "dấu ngoặc kép"; Tôi đã chỉnh sửa nó sau đó.
goldilocks

7
@denys Bạn đã sai: phản ứng của goldilocks không tệ hơn của bạn. .1 Vui lòng tránh sử dụng cat ...| cú pháp!. .2 Để đánh dấu các dòng trống VÀ các dòng chỉ chứa khoảng trắng, có thể với các nhận xét U có thể sử dụng điều này:grep -v "^ *\(#.*\|\)$" < smb.conf
F. Hauri

7
@EmanuelBerg Đó là một ngã ba vô dụng. cat file | grep "blah"implie chạy hai nhị phân thông qua fifo , trong khi grep "blah" <filethực hiện chính xác và liên kết tự file nhiên với grep's STDIN. [bash] con mèo vô dụng là một chủ đề tìm kiếm đầy đủ tính năng thông qua bất kỳ công cụ tìm kiếm nào! -> blog.sanctum.geek.nz/usless-use-of-cat ... để lấy mẫu
F. Hauri

2
Nó không làm chính xác như vậy . Nó tạo ra 2 quy trình và một đường ống trong đó 1 quy trình là đủ. Đọc liên kết được đưa ra trong bình luận cuối cùng của @ F.Hauri.
rahmu

4

Giải pháp Vim:

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

Tôi tình cờ gặp câu hỏi này khi cố gắng tự tìm giải pháp vim.


1
Điều này cũng sẽ xóa các dòng bắt đầu với khoảng trống.
Kusalananda

Thật. Tôi thấy rằng hữu ích cho các tập tin cấu hình như các dòng giữa các bình luận nếu không thì điền vào đầu ra. Nếu bạn muốn giữ các dòng trống, hãy thay đổi *thành +như sau:v/^\s+[#\n]/p
David Lord

3

Đường ống đến grep trong câu trả lời của oliver nadj có thể được loại bỏ bằng cách (giả sử GNU grephoặc tương thích):

grep -v "^\s*[#\;]\|^\s*$" <some_conf_file>

Grep thứ hai i @ nadj trông có vẻ vô dụng, câu trả lời của @ goldilocks còn hơn cả không.
Archemar

1
Tôi đồng ý rằng câu trả lời của goldilocks là chính xác. Tuy nhiên, tôi cũng coi nó hữu ích để không hiển thị các dòng trống.
Morten Lind

2
grep -v "^\s*[#;]" any.conf | grep -v "^\s*$"

đó là những gì làm việc cho tôi bỏ qua các dòng nhận xét hoặc trống, thậm chí khoảng trắng trước dấu băm hoặc dấu chấm phẩy


2

Những ví dụ này có thể được sử dụng cho mọi người.

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

Ví dụ grep đầu tiên loại trừ các dòng bắt đầu với bất kỳ khoảng trắng nào theo sau là ký hiệu băm.

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

Thứ hai loại trừ các dòng bắt đầu với bất kỳ khoảng trắng nào theo sau là ký hiệu băm hoặc dấu chấm phẩy.

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

[user@host tmp]$

0

Ở đây tôi có một cái tốt hơn (giả sử GNU grephoặc tương thích):

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

loại trừ các dòng bắt đầu bằng #;/%<dấu ngoặc vuông và bộ lọc thứ hai sau đường ống \s*$dành cho các dòng trống.


2
Trong các loại tập tin conf là <hoặc /được sử dụng cho ý kiến? Tôi biết rất nhiều định dạng tập tin conf trong đó <là tất cả mọi thứ trừ một bình luận. !đôi khi được sử dụng như trong các tệp tài nguyên X.
Stéphane Chazelas


-2
egrep -v "^#|^$" anyfile.txt

Lệnh này là để grep tất cả thông tin trong tệp không bao gồm các bình luận và các dòng trống.


2
Lưu ý rằng smb.conf cũng bình luận với;
Jeff Schaller

-3

Điều này sẽ hiển thị cho bạn tệp mà không có những dòng bắt đầu bằng #: grep -v "^#" filename


Điều này không có gì để dòng bắt đầu với ;.
Kusalananda
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.