Kapan menggunakan grep, kurang, awk, dan [ditutup]

17

Saya memasuki dunia Linux dan di tempat kerja saya menggunakan greplebih banyak dan lebih banyak lagi. Dengan melakukan itu saya mencari tahu bahwa kadang-kadang itu tidak cukup untuk apa yang saya inginkan.

Saya berjuang dengan grepbeberapa hari yang lalu dan seorang kolega saya yang merupakan admin senior Linux, menyuruh saya untuk menggunakannya awk. Saya terkejut dengan seberapa cepat saya mendapatkan hasil.

Jadi pertanyaan saya adalah kapan Anda memilih untuk menggunakan salah satunya? Pertanyaan apa yang bisa saya tanyakan pada diri sendiri sebelum bekerja dengan grepdan menghabiskan banyak waktu, ketika saya bisa melakukannya dengan awkdan menghemat waktu?

frankguthrie
sumber
Ini adalah pertanyaan yang bagus tetapi sebenarnya sangat luas dan terutama didasarkan pada pendapat. Untuk menjawab pertanyaan Anda, menggunakan grep sebagai lawan awk sangat tergantung pada seberapa nyaman Anda menggunakan awk / sed. Ada beberapa alasan mengapa seseorang akan menggunakan ini di atas yang terakhir seperti mencari sesuatu yang lebih spesifik daripada apa yang ditawarkan grep atau jika Anda mencoba untuk mengganti / mengedit file dengan string tertentu (menggunakan sed). Tetapi sekali lagi, semua tergantung pada tingkat kenyamanan dan pengalaman Anda menggunakan awk / sed.
ryekayo
7
Gunakan lessuntuk melihat file. Gunakan grepuntuk mencari melalui file. Gunakan seduntuk mengedit file. Gunakan awklebih grepdan sedketika file yang ingin Anda proses memiliki beberapa jenis struktur (seperti kolom). Gunakan sedlebih dari awksaat Anda terutama ingin berurusan dengan baris (seperti menghapus atau menambahkan baris teks). Saya yakin seseorang akan menulis jawaban 20 halaman yang lebih lengkap daripada jawaban saya.
Satō Katsura
Hai Sato, ini bukan tentang panjangnya, tapi apa yang dikatakan. Dan Anda beberapa baris sangat informatif. Terima kasih.
frankguthrie

Jawaban:

25

seddan awksuperset grep, ada hal-hal yang lebih mudah dilakukan dengan satu atau yang lain.

grep foodapat ditulis sed '/foo/!d'atau awk /foo/, tetapi pertimbangkan:

grep -i fooharus sed '/[fF][oO][oO]/!d'kecuali Anda ingin mempertimbangkan ekstensi non-standar seperti GNU sed '/foo/I!d'. Atau dengan awk: awk 'tolower($0) ~ /foo/'atau lagi menggunakan ekstensi GNU: awk -v IGNORECASE=1 /foo/.

Hal-hal yang berbeda dari alat yang baik dan rumit dengan alat lainnya:

grep

grepadalah alat sederhana tetapi memiliki mode operasi yang sangat khusus yang lebih sulit untuk direproduksi dengan awkatau sed:

  • grep -i untuk pencocokan case-sensitive (lihat di atas)
  • grep -Fe "$string"untuk pencarian string tetap ( export string; awk 'index($0, ENVIRON["string"])'dengan awk, tidak ada padanan langsung dengan sed).
  • (non standar) grep -runtuk pencarian rekursif
  • (non standar) grep -P/ pcregrepuntuk regexps seperti perl (beberapa sedimplementasi memiliki dukungan regexp seperti perl meskipun bukan yang paling utama)
  • (non standar) grep -ountuk mengembalikan bagian yang cocok (beberapa baris awkatau seduntuk melakukan hal yang sama)
  • (tidak standar) grep -A/B/Cuntuk mengembalikan konteks sekitar pertandingan (sekali lagi menyakitkan untuk dilakukan dengan cara yang sama dengan sedatau awk)

sed

  • s/foo/bar/: sed'S sperintah memiliki fitur yang sulit untuk menerapkan di awkseperti:
  • s/foo\(.*\)bar/\1/g: capturing (meskipun GNU awk memiliki gensub()ekstensi untuk itu)
  • s/foo/bar/3: ganti kemunculan ke-3 di setiap baris
  • (non-standar): pengeditan file di tempat (meskipun sekarang juga didukung oleh GNU awk).

awk

awk adalah fitur yang paling kaya dari ketiganya.

  • bagus untuk berurusan dengan angka
  • bagus untuk berurusan dengan input yang diformat dalam kolom.
  • baik untuk mengekstraksi dan menggabungkan data dari berbagai sumber, dengan array asosiatifnya.

perl

perlsebagai alat ekstraksi dan pelaporan yang praktis memiliki yang terbaik dari semua itu. Itulah yang awalnya dirancang untuk (menjadi alat yang membuat semua itu sed/ awkusang).

Menguasai perlmelakukan pemrosesan teks memang memberi keuntungan serius. Saya akan merekomendasikan meluangkan waktu untuk itu, bahkan sebelum melihat sedperintah yang kurang umum misalnya.

kinerja

Sebagai aturan praktis, semakin khusus alat ini, semakin efisien tugasnya. Tapi itu juga sangat tergantung pada implementasi, tugas dan beberapa faktor lain dan kinerja dapat memiliki trade-off yang mungkin perlu diperhitungkan.

Misalnya, ada beberapa grepatau sedimplementasi yang sangat cepat, tetapi misalnya mereka tidak mendukung karakter multibyte sehingga hanya dapat bekerja dengan benar pada teks AS-Inggris di lokal multi-byte. Atau mereka cepat karena mereka bekerja pada buffer panjang tetap kecil dan dengan demikian tidak dapat bekerja pada input sewenang-wenang ...

Stéphane Chazelas
sumber
Jawaban yang sangat bagus! Apakah Anda tahu tentang efisiensi alat? Saya bingung tentang pernyataan OP, itu awkjauh lebih cepat daripada grep.
pfnuesel
@ pfnuesel, itu sangat tergantung pada implementasi dan pola penggunaan. Misalnya, mawkdikenal sangat efisien (tetapi tidak mendukung karakter multibyte yang merupakan bagian dari alasan itu lebih efisien daripada beberapa alat lain)
Stéphane Chazelas