Saya menggunakan skrip untuk secara teratur mengunduh pesan gmail saya yang mengompresi file .eml menjadi file .gz. Script membuat folder untuk setiap hari, dan kemudian memampatkan setiap pesan ke file sendiri.
Saya ingin cara mencari "string" di arsip ini.
Grep sendiri sepertinya tidak melakukannya. Saya juga mencoba SearchMonkey.
zgrep
:zgrep - search possibly compressed files for a regular expression
Jawaban:
Jika Anda ingin melakukan grep secara rekursif di semua file .eml.gz di direktori saat ini, Anda dapat menggunakan:
Anda harus melarikan diri terlebih dahulu
*
sehingga shell tidak menafsirkannya.-print0
memberitahu find untuk mencetak karakter nol setelah setiap file ditemukan;xargs -0
membaca dari input standar dan menjalankan perintah setelahnya untuk setiap file;zgrep
berfungsi sepertigrep
, tetapi tidak mengompres file terlebih dahulu.sumber
zgrep
sebenarnya sepertinya lebih cepat daripadagrep
dijalankan pada file yang tidak terkompresi. Pasti karena file terkompresi dapat membaca HD dan didekompresi lebih cepat daripada membaca file yang tidak terkompresi dari HD.xargs
menggunakan blanks (whitespace) secara default. Tentu, file hampir tidak pernah memiliki baris baru di dalamnya, tetapi spasi tidak pernah terdengar sebelumnya (bahkan jika sebagian besar jenis UNIX tidak menyukai mereka). Yang mengatakan, Anda dapat menyederhanakan tanpa khawatir tentang ruang putih bahkan lebih mudah:find . -name '*.eml.gz' -exec zgrep "STRING" {} +
Itu mendapat banyak argumen yang sama per-peluncuranxargs
, keamanan-print0
/-0
, dan semua tanpa overhead dari peluncuran dan perpipaan proses ekstra, dan cukup ringkas.-exec
dengan+
POSIX ditentukan, jadi itu harus di sebagian besar sistem mirip UNIX semi-baru-baru ini untuk pengetahuan saya.ABCLog04_18_18_2_21.gz
Apakah ada cara untuk mencari file yang dimulai dengan ABC * secara rekursif. Saya mencoba mengganti\*.eml.gz
dalam contoh Anda di atas denganABCLog*
dan mendapatkan kesalahan tentang format file .:find: paths must precede expression: ABCLog-2018-03-12-10-16-1.log.gz Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
Ada banyak kebingungan di sini karena tidak hanya ada satu
zgrep
. Saya memiliki dua versi di sistem saya,zgrep
darigzip
danzgrep
darizutils
. Yang pertama hanyalah skrip pembungkus yang memanggilgzip -cdfq
. Itu tidak mendukung-r, --recursive
saklar. 1Yang terakhir adalah
c++
program yang dan mendukung para-r, --recursive
pilihan.Menjalankan
zgrep --version | head -n 1
akan mengungkapkan yang mana (jika ada) dari mereka adalah default:adalah skrip wrapper,
adalah
cpp
executable.Jika Anda memiliki yang terakhir, Anda dapat menjalankan:
Bagaimanapun, seperti yang disarankan,
find
+zgrep
akan bekerja dengan baik dengan versizgrep
:Jika
zgrep
hilang dari sistem Anda (sangat tidak mungkin), Anda dapat mencoba:tetapi ada kelemahan utama: Anda tidak akan tahu di mana pertandingan tersebut karena tidak ada nama file yang ditambahkan ke baris yang cocok.
1: karena akan bermasalah
sumber
zgrep
dari zutils tidak tersedia Anda dapat menginstalnya di Ubuntu dengansudo apt-get install zutils
.grep -n
,zgrep -n
akan mencetak baris no. Ada dalam manual ...ag
adalah varian darigrep
, dengan beberapa fitur tambahan yang bagus.Begitu:
Jika tidak dipasang,
sumber
ag: truncated file: Success
hasilnya. Adakah bendera lain yang harus saya tambahkan?Rekursi sendiri mudah:
Namun, untuk file terkompresi Anda memerlukan sesuatu seperti:
path/to/directory
harus menjadi direktori induk yang berisi subdirektori untuk setiap hari.zgrep
adalah jawaban yang jelas tetapi, sayangnya, itu tidak mendukung-r
bendera. Dariman zgrep
:sumber
Jika sistem Anda memiliki zgrep, Anda dapat melakukannya
zgrep -irs your-pattern-goes-here the-folder-to-search-goes-here/
Jika sistem Anda tidak memiliki zgrep, Anda dapat menggunakan perintah find untuk menjalankan zcat dan grep terhadap setiap file seperti ini:
find the-folder-to-search-goes-here/ -name '*.gz' \ -exec sh -c 'echo "Searching {}" ; zcat "{}" | grep your-pattern-goes-here ' \;
sumber
Searching ~/gmvault-db/db/2015-02/03/whatever.gz
zgrep
tidak akan menerima-r
bendera karena suatu alasan. Itu disebutkan dalamman zgrep
(juga lihat jawaban saya).xzgrep adalah turunan dari utils zgrep (less / bin / xzgrep)
Dari halaman Manual:
-l cetak nama file yang cocok
-R untuk rekursi tidak akan berfungsi karena secara khusus dilarang dalam skrip, namun shell globbing sederhana harus membawa kita ke sana
dari jalur relatif di mana ./today/sample.eml.gz, cocok dengan semua contoh yang satu tingkat di bawah posisi relatif kami di shell, yang diakhiri dengan ".eml.gz"
sumber