sed
dan awk
superset grep
, ada hal-hal yang lebih mudah dilakukan dengan satu atau yang lain.
grep foo
dapat ditulis sed '/foo/!d'
atau awk /foo/
, tetapi pertimbangkan:
grep -i foo
harus 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
grep
adalah alat sederhana tetapi memiliki mode operasi yang sangat khusus yang lebih sulit untuk direproduksi dengan awk
atau 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 -r
untuk pencarian rekursif
- (non standar)
grep -P
/ pcregrep
untuk regexps seperti perl (beberapa sed
implementasi memiliki dukungan regexp seperti perl meskipun bukan yang paling utama)
- (non standar)
grep -o
untuk mengembalikan bagian yang cocok (beberapa baris awk
atau sed
untuk melakukan hal yang sama)
- (tidak standar)
grep -A/B/C
untuk mengembalikan konteks sekitar pertandingan (sekali lagi menyakitkan untuk dilakukan dengan cara yang sama dengan sed
atau awk
)
sed
s/foo/bar/
: sed
'S s
perintah memiliki fitur yang sulit untuk menerapkan di awk
seperti:
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
perl
sebagai alat ekstraksi dan pelaporan yang praktis memiliki yang terbaik dari semua itu. Itulah yang awalnya dirancang untuk (menjadi alat yang membuat semua itu sed
/ awk
usang).
Menguasai perl
melakukan pemrosesan teks memang memberi keuntungan serius. Saya akan merekomendasikan meluangkan waktu untuk itu, bahkan sebelum melihat sed
perintah 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 grep
atau sed
implementasi 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 ...