GNU/Linux >> Belajar Linux >  >> Linux

3 perintah Linux yang harus diketahui untuk manipulasi teks

Sysadmin menggunakan alat baris perintah yang tak terhitung jumlahnya, dan Anda mungkin sering menggunakan tiga yang dibahas dalam artikel ini:grep , sed , dan awk . Tapi apakah Anda tahu semua cara Anda dapat menggunakannya untuk memanipulasi teks? Jika tidak (atau Anda tidak yakin), lanjutkan membaca.

Sebelum saya mulai, berikut adalah asal usul nama perintah:

  1. grep :Menurut Wikipedia, nama "berasal dari ed perintah g/re/p (g telusuri r . secara lokal e biasa ekspresi dan p cetak garis yang cocok), yang memiliki efek yang sama." ed adalah "editor teks berorientasi baris." Bahkan untuk seseorang yang menyukai baris perintah, mengedit file baris demi baris tampaknya terlalu kuno, tetapi orang harus memulai dengan sesuatu di zaman kuno ).
  2. sed :Nama ini berasal dari penggunaan utamanya, sebagai s tream ed itu.
  3. awk :Namanya berasal dari inisial penulisnya (Aho, Weinberger, dan Kernighan). Jika nama Kernighan membunyikan lonceng apa pun (permainan kata-kata) untuk Anda, itu karena ilmuwan komputer Kanada ini berkontribusi pada penciptaan Unix dan ikut menulis buku pertama tentang bahasa C.

Sangat bagus untuk melacak pohon silsilah perintah, tetapi yang terpenting adalah perintah ini cukup membantu untuk manipulasi teks.

Dalam contoh berikut, saya akan menggunakan file bernama quotes.txt untuk mengilustrasikan cara menggunakan perintah. Berikut isi dari file ini:

$ cat quotes.txt

"God does not play dice with the universe."
- Albert Einstein, The Born-Einstein Letters 1916-55

"Not only does God play dice but... he sometimes throws them where they cannot be seen."
- Stephen Hawking

"I regard consciousness as fundamental..."
- Max Planck

"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."
- Carl Sagan

"[T]he atoms or elementary particles themselves are not real; they form a world of potentialities or possibilities rather than one of things or facts."
- Werner Heisenberg

grep

Cara paling sederhana untuk menggunakan grep adalah:

$ grep universe quotes.txt

"God does not play dice with the universe."
"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."

Contoh ini memberikan string untuk ditelusuri (alam semesta) dan tempat untuk mencarinya (quotes.txt).

Jika ada spasi dalam string yang ingin Anda cari, Anda harus memberi tanda kutip di sekitarnya:

$ grep "the universe" quotes.txt

"God does not play dice with the universe."
"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."

Beberapa variasi umum saat menggunakan grep adalah:

  • Abaikan huruf besar/kecil:grep -i string-to-search filename
  • Telusuri di banyak file:grep -i string-to-search *.txt

Anda dapat mencari ekspresi reguler:

$ grep "191[0-9]" quotes.txt

- Albert Einstein, The Born-Einstein Letters 1916-55

Jika Anda ingin mengaktifkan pola regexp yang diperluas untuk menggunakan simbol seperti + , ? , atau | , Anda dapat menggunakan egrep perintah, yang merupakan jalan pintas untuk menambahkan -E tandai ke grep . Ini juga memungkinkan Anda untuk mencari beberapa string:

$ egrep -i "albe|hawk" quotes.txt

- Albert Einstein, The Born-Einstein Letters 1916-55
- Stephen Hawking

Untuk menampilkan baris yang menyertakan kata "semesta" ditambah baris berikutnya (untuk menyertakan nama penulis):

$ grep -i universe -A 1 quotes.txt

"God does not play dice with the universe."
- Albert Einstein, The Born-Einstein Letters 1916-55
--
"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."
- Carl Sagan

Seperti yang mungkin bisa Anda tebak, Anda bisa menampilkan lebih banyak garis dengan melewatkan nomor yang berbeda. Atau Anda dapat menunjukkan baris sebelumnya dengan menggunakan flag -B .

Sejauh ini, saya telah menunjukkan grep berjalan sendiri, tetapi sangat umum untuk memilikinya dalam rantai perintah:

$ echo "Authors who mentioned 'universe'"; cat quotes.txt | grep -i universe -A 1 | grep "^-"

- Albert Einstein, The Born-Einstein Letters 1916-55
- Carl Sagan

[ Anda mungkin juga tertarik untuk membaca 11 perintah Linux yang tidak dapat saya jalani tanpanya. ]

sed

Penggunaan favorit saya untuk sed adalah untuk mengganti string dalam file. Misalnya:

$ cat quotes.txt | sed 's/universe/Universe/g'

Ini akan menggantikan universe dengan Universe dan kirim hasilnya ke stdout . g flag berarti "ganti semua kemunculan string di setiap baris."

Beberapa variasi untuk ini adalah:

  • Ganti string hanya jika ditemukan di tiga baris pertama:
    sed '1,3 s/universe/Universe/g' quotes.txt
  • Ganti n -kemunculan pola dalam satu baris (misalnya, kemunculan kedua):
    sed 's/universe/Universe/2' quotes.txt

Contoh-contoh ini tidak mengubah file asli. Jika Anda ingin sed untuk mengubah file di tempat, gunakan -i :

$ sed -i 's/universe/Universe/g' quotes.txt

Jika Anda menggunakan -i bendera, pastikan Anda tahu persis apa dan berapa banyak kejadian akan terpengaruh, karena akan mengubah file asli. Untuk mengetahuinya, Anda dapat menjalankan grep dan cari polanya dulu.

[ Ingin menguji kemampuan sysadmin Anda? Ikuti penilaian keterampilan hari ini. ]

awk

awk utilitas sangat kuat, menawarkan banyak opsi untuk memproses file teks.

Sebagian besar situasi di mana saya menggunakan awk melibatkan pemrosesan file dengan struktur (kolom) yang cukup dapat diprediksi, termasuk karakter yang digunakan sebagai pemisah kolom.

Ketika awk memproses file, itu membagi setiap baris menggunakan "pemisah bidang" (variabel internal FS , yang secara default adalah karakter spasi). Setiap bidang ditetapkan ke variabel posisi ($1 berisi bidang pertama, $2 berisi yang kedua, dan seterusnya. $0 mewakili garis penuh).

Anda juga dapat menerapkan filter ke setiap baris. Misalnya:

$ cat quotes.txt | awk '/universe/ { print NR " - " $0 }'

1 - "God does not play dice with the universe."
10 - "The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."

Perintah yang diteruskan ke awk gunakan tanda kutip tunggal (seperti melewatkan program mini untuk ditafsirkan):

  • /universe/ bagian memberitahu awk untuk memilih hanya garis yang cocok dengan pola ini.
  • Program "utama" berada di antara tanda kurung kurawal.
  • NR adalah variabel internal yang berisi nomor catatan saat ini, misalnya, nomor baris saat ini.
  • Saya menambahkan " -" string untuk estetika.

Variabel internal di awk adalah:

  • NR :Jumlah total catatan input yang dilihat sejauh ini oleh perintah
  • NF :Jumlah bidang dalam catatan input saat ini
  • FS :Pemisah kolom input (spasi secara default)

Berikut adalah contoh menggunakan format file yang lebih "dapat diprediksi":

$ cat /etc/passwd | awk '/nologin/ { FS=":"; print $1 }'

(output omitted)
...
redis
akmods
cjdns
haproxy
systemd-oom

Dalam contoh terakhir ini:

  • /nologin/ hanya memilih garis yang berisi pola ini.
  • FS=": "; menyetel pemisah bidang ke : bukan default (spasi).
  • print $1 mencetak bidang pertama di setiap baris (mengingat pemisahnya adalah : ).

Pelajari lebih lanjut

Itulah beberapa contoh sederhana untuk menggunakan grep , sed , dan awk .

Jika Anda membaca man untuk masing-masing halaman, Anda akan melihat banyak parameter dan kegunaan tambahan untuk perintah praktis ini.

Untuk kasus penggunaan sederhana dan hal-hal yang hanya Anda lakukan sesekali, selalu baik untuk memiliki alat seperti ini di kotak alat Anda.

Jika tindakan yang diperlukan lebih kompleks, ada baiknya mempertimbangkan apakah alat ini masih masuk akal untuk Anda gunakan. Untuk kasus penggunaan perusahaan atau mengelola "semuanya sebagai kode", saya sarankan menggunakan Ansible. Modul Ansible memiliki fitur serupa yang memungkinkan Anda meniru operasi yang dijelaskan di atas, dengan keuntungan bahwa modul Ansible biasanya memiliki idempotensi dan proses lengkapnya akan didokumentasikan di suatu tempat (seperti di repo Git internal Anda).


Linux
  1. 3 lembar contekan Linux penting untuk produktivitas

  2. 8 perintah Linux untuk manajemen proses yang efektif

  3. Perintah bash bang:Trik yang harus diketahui untuk baris perintah Linux

  1. Perintah Linux favorit saya untuk mengoptimalkan gambar web

  2. 20 perintah Linux penting untuk setiap pengguna

  3. Lembar contekan untuk perintah umum Linux

  1. 12 Perintah Berguna Untuk Memfilter Teks untuk Operasi File yang Efektif di Linux

  2. 10 Perintah Linux Untuk Diagnostik Jaringan

  3. Linux – Bagaimana Cara Mendapatkan Kata Tertentu Dan Mengambil Teks?