GNU/Linux >> Belajar Linux >  >> Linux

Kembalikan Hanya Bagian Dari Garis Setelah Pola Yang Cocok?

Jadi menarik membuka file dengan cat dan kemudian menggunakan grep untuk mendapatkan garis yang cocok hanya membuat saya sejauh ini ketika saya bekerja dengan set log tertentu yang saya hadapi. Ini membutuhkan cara untuk mencocokkan garis ke pola, tetapi hanya untuk mengembalikan bagian dari garis setelah pertandingan. Porsi sebelum dan sesudah pertandingan akan selalu bervariasi. Saya telah bermain dengan menggunakan sed atau awk , tetapi belum dapat menemukan cara memfilter baris untuk menghapus bagian sebelum pertandingan, atau hanya mengembalikan bagian setelah pertandingan, keduanya akan berfungsi.
Ini adalah contoh baris yang saya butuhkan untuk memfilter:

2011-11-07T05:37:43-08:00 <0.4> isi-udb5-ash4-1(id1) /boot/kernel.amd64/kernel: [gmp_info.c:1758](pid 40370="kt: gmp-drive-updat")(tid=100872) new group: <15,1773>: { 1:0-25,27-34,37-38, 2:0-33,35-36, 3:0-35, 4:0-9,11-14,16-32,34-38, 5:0-35, 6:0-15,17-36, 7:0-16,18-36, 8:0-14,16-32,34-36, 9:0-10,12-36, 10-11:0-35, 12:0-5,7-30,32-35, 13-19:0-35, 20:0,2-35, down: 8:15, soft_failed: 1:27, 8:15, stalled: 12:6,31, 20:1 }

Porsi yang saya butuhkan adalah segalanya setelah "macet".

Latar belakang di balik ini adalah agar saya dapat mengetahui seberapa sering sesuatu terhenti:

cat messages | grep stalled | wc -l

Apa yang perlu saya lakukan adalah mencari tahu berapa kali node tertentu terhenti (ditunjukkan oleh bagian sebelum setiap titik dua setelah "berhenti". Jika saya hanya menerimanya (yaitu 20:) itu mungkin mengembalikan baris yang gagal lunak, tetapi tidak ada stall, yang tidak membantu saya. Saya hanya perlu memfilter bagian yang terhenti sehingga saya dapat mengambil node tertentu dari node yang terhenti.

Untuk semua maksud dan tujuan, ini adalah sistem freebsd dengan utilitas inti GNU standar, tetapi saya tidak dapat menginstal tambahan apa pun untuk membantu.

Jawaban yang Diterima:

Alat kanonik untuk itu adalah sed .

sed -n -e 's/^.*stalled: //p'

Penjelasan detail:

  • -n berarti tidak mencetak apa pun secara default.
  • -e diikuti dengan perintah sed.
  • s adalah perintah penggantian pola.
  • Ekspresi reguler ^.*stalled: cocok dengan pola yang Anda cari, ditambah teks sebelumnya (.* artinya teks apa saja, dengan ^ initial inisial untuk mengatakan bahwa pertandingan dimulai di awal baris). Perhatikan bahwa jika stalled: terjadi beberapa kali di telepon, ini akan cocok dengan kejadian terakhir.
  • Pertandingan, yaitu semua yang ada di barisan hingga stalled: , diganti dengan string kosong (yaitu dihapus).
  • p terakhir berarti mencetak garis yang diubah.

Jika Anda ingin mempertahankan bagian yang cocok, gunakan referensi balik:1 di bagian pengganti menunjukkan apa yang ada di dalam grup (…) dalam pola. Di sini, Anda dapat menulis stalled: lagi di bagian pengganti; fitur ini berguna ketika pola yang Anda cari lebih umum daripada string sederhana.

sed -n -e 's/^.*(stalled: )/1/p'

Terkadang Anda ingin menghapus bagian dari garis setelah pertandingan. Anda dapat memasukkannya ke dalam pertandingan dengan memasukkan .*$ di akhir pola (teks apa saja .* diikuti oleh akhir baris $ ). Kecuali Anda memasukkan bagian itu ke dalam grup yang Anda rujuk dalam teks pengganti, akhir baris tidak akan ada di output.

Terkait:Sed:hanya mencetak kemunculan pertama dari kecocokan pola?

Sebagai ilustrasi lebih lanjut tentang grup dan referensi balik, perintah ini menukar bagian sebelum pertandingan dan bagian setelah pertandingan.

sed -n -e 's/^(.*)(stalled: )(.*)$/321/p'

Linux
  1. Cetak Garis Pencocokan Dan Garis Ke-N Dari Garis Yang Cocok?

  2. Cetak Baris Sebelumnya Setelah Pencocokan Pola Menggunakan Sed?

  3. Pertahankan Hanya Baris Pertama Dari Setiap Urutan Garis Berturut-turut yang Cocok dengan Pola?

  1. Sed:Cetak Hanya Kejadian Pertama Dari Kecocokan Pola?

  2. Temukan Hanya Kejadian Pertama Menggunakan Only Grep?

  3. Berapa totalnya di baris pertama setelah ls -l?

  1. sed untuk memasukkan hanya pada pertandingan pertama

  2. Konsep 'Hold space' dan 'Pattern space' di sed

  3. Cara membuat perintah grep mengembalikan seluruh baris yang cocok