Saya memasuki dunia Linux dan di tempat kerja saya menggunakan grep
lebih 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 grep
beberapa 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 grep
dan menghabiskan banyak waktu, ketika saya bisa melakukannya dengan awk
dan menghemat waktu?
less
untuk melihat file. Gunakangrep
untuk mencari melalui file. Gunakansed
untuk mengedit file. Gunakanawk
lebihgrep
dansed
ketika file yang ingin Anda proses memiliki beberapa jenis struktur (seperti kolom). Gunakansed
lebih dariawk
saat 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.Jawaban:
sed
danawk
supersetgrep
, ada hal-hal yang lebih mudah dilakukan dengan satu atau yang lain.grep foo
dapat ditulissed '/foo/!d'
atauawk /foo/
, tetapi pertimbangkan:grep -i foo
harussed '/[fF][oO][oO]/!d'
kecuali Anda ingin mempertimbangkan ekstensi non-standar seperti GNUsed '/foo/I!d'
. Atau denganawk
: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 denganawk
ataused
:grep -i
untuk pencocokan case-sensitive (lihat di atas)grep -Fe "$string"
untuk pencarian string tetap (export string; awk 'index($0, ENVIRON["string"])'
denganawk
, tidak ada padanan langsung dengansed
).grep -r
untuk pencarian rekursifgrep -P
/pcregrep
untuk regexps seperti perl (beberapased
implementasi memiliki dukungan regexp seperti perl meskipun bukan yang paling utama)grep -o
untuk mengembalikan bagian yang cocok (beberapa barisawk
ataused
untuk melakukan hal yang sama)grep -A/B/C
untuk mengembalikan konteks sekitar pertandingan (sekali lagi menyakitkan untuk dilakukan dengan cara yang sama dengansed
atauawk
)sed
s/foo/bar/
:sed
'Ss
perintah memiliki fitur yang sulit untuk menerapkan diawk
seperti:s/foo\(.*\)bar/\1/g
: capturing (meskipun GNU awk memilikigensub()
ekstensi untuk itu)s/foo/bar/3
: ganti kemunculan ke-3 di setiap barisawk
).awk
awk
adalah fitur yang paling kaya dari ketiganya.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 itused
/awk
usang).Menguasai
perl
melakukan pemrosesan teks memang memberi keuntungan serius. Saya akan merekomendasikan meluangkan waktu untuk itu, bahkan sebelum melihatsed
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
ataused
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 ...sumber
awk
jauh lebih cepat daripadagrep
.mawk
dikenal sangat efisien (tetapi tidak mendukung karakter multibyte yang merupakan bagian dari alasan itu lebih efisien daripada beberapa alat lain)