Bagaimana cara mendapatkan garis yang tidak dimulai dengan "#" atau ";"?

78

Saya ingin smb.confmelihat dan hanya melihat baris yang tidak dikomentari.

denys
sumber
1
testparmlakukan ini dengan lebih baik karena ini juga menampilkan nilai default.
F. Hauri
@ F. Hauri Terima kasih. itu bekerja juga. Tapi itu juga menghasilkan beberapa informasi yang tidak dibutuhkan (dalam kasus saya), yang harus dipahami juga ...
denys
superset: any regex: superuser.com/questions/655715/regex-does-not-begin-by-pattern
Ciro Santilli 新疆 改造 中心 法轮功 六四 六四
Cara lain melalui PCRE grep stackoverflow.com/a/45917459/3297613
Avinash Raj

Jawaban:

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

Yang pertama ^mengacu pada awal baris, jadi baris dengan komentar yang dimulai setelah karakter pertama tidak akan dikecualikan. [^#;]berarti setiap karakter yang bukan #atau ;.

Dengan kata lain, ini melaporkan baris yang dimulai dengan karakter selain #dan ;. Ini tidak sama dengan melaporkan baris yang tidak dimulai dengan #dan ;(yang akan Anda gunakan grep -v '^[#;]') di dalamnya juga mengecualikan baris kosong , tapi itu mungkin lebih baik dalam hal ini karena saya ragu Anda peduli tentang baris kosong.

Jika Anda ingin mengabaikan karakter kosong utama, Anda dapat mengubahnya menjadi:

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

atau

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

Atau

awk '$1 ~ /^[^;#]/' smb.conf
goldilocks
sumber
jawaban yang benar adalah: cat /etc/samba/smb.conf | grep ^[^#\;]Tapi bagaimanapun juga Terima kasih
menolak
Ya, atau Anda bisa menggunakan "kutipan"; Saya mengeditnya kemudian.
goldilocks
7
@denys Anda salah: respons goldilocks tidak lebih buruk dari Anda. .1 Harap menghindari penggunaan cat ...| sintaks !. .2 Untuk mencambuk garis kosong DAN garis yang hanya berisi ruang, mungkin dengan komentar Anda bisa menggunakan ini:grep -v "^ *\(#.*\|\)$" < smb.conf
F. Hauri
7
@ EmanuelBerg Ini garpu yang tidak berguna. cat file | grep "blah"impie menjalankan dua binari melalui fifo , sementara grep "blah" <filemelakukan hal yang persis sama dan mengikat file secara alami ke grep STDIN. [bash] kucing tidak berguna adalah subjek pencarian fitur lengkap melalui mesin pencari apa pun! -> blog.sanctum.geek.nz/useless-use-of-cat ... untuk sampel
F. Hauri
2
Itu tidak melakukan hal yang persis sama . Ini menciptakan 2 proses dan pipa di mana 1 proses sudah cukup. Baca tautan yang diberikan di komentar terakhir @ F.Hauri.
rahmu
4

Solusi Vim:

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

Saya menemukan pertanyaan ini ketika mencoba menemukan solusi vim sendiri.

David Lord
sumber
1
Ini juga akan menghapus baris yang dimulai dengan kosong.
Kusalananda
Benar. Saya menemukan bahwa berguna untuk file konfigurasi sebagai garis antara komentar jika tidak mengisi output. Jika Anda lebih suka menjaga garis kosong, mengubah *ke +suka begitu:v/^\s+[#\n]/p
David Tuhan
3

Pipa untuk menerima jawaban oliver nadj dapat dihilangkan dengan (dengan asumsi GNU grepatau kompatibel):

grep -v "^\s*[#\;]\|^\s*$" <some_conf_file>
Morten Lind
sumber
Grep kedua i @ nadj terlihat tidak berguna, jawaban @ goldilocks lebih dari cukup.
Archemar
1
Saya setuju bahwa jawaban goldilocks benar. Namun, saya juga menganggap berguna untuk tidak menampilkan garis kosong.
Morten Lind
2
grep -v "^\s*[#;]" any.conf | grep -v "^\s*$"

itulah yang bekerja untuk saya. abaikan komentar atau baris kosong, bahkan spasi sebelum tanda pagar atau titik koma

oliver nadj
sumber
2

Contoh-contoh ini mungkin bermanfaat bagi orang.

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

Contoh grep pertama mengecualikan baris yang dimulai dengan jumlah spasi putih diikuti dengan simbol hash.

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

Yang kedua tidak termasuk baris yang dimulai dengan jumlah spasi putih diikuti dengan simbol hash atau titik koma.

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

[user@host tmp]$
JungleMartin
sumber
0

Di sini saya mendapatkan yang lebih baik (dengan asumsi GNU grepatau kompatibel):

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

kecualikan untuk garis yang dimulai dengan #;/%<tanda kurung siku dan filter kedua setelah pipa \s*$untuk garis kosong.

S. Venkata Ramana
sumber
2
Dalam jenis file conf apa <atau /digunakan untuk komentar? Saya tahu banyak format file conf di mana <segalanya kecuali komentar. !kadang-kadang digunakan seperti dalam file sumber daya X.
Stéphane Chazelas
-2
egrep -v "^#|^$" anyfile.txt

perintah ini adalah untuk mengambil semua informasi dalam file tidak termasuk komentar dan baris kosong.

Mustafa Hussein
sumber
2
Perhatikan bahwa smb.conf juga berkomentar dengan;
Jeff Schaller
-3

Ini akan menampilkan Anda file tanpa baris yang dimulai dengan #: grep -v "^#" filename

Avinasha
sumber
Ini tidak melakukan apa pun untuk baris mulai dengan ;.
Kusalananda