Menggunakan awk
, saya perlu menemukan kata dalam file yang cocok dengan pola regex.
Saya hanya ingin mencetak kata yang cocok dengan polanya.
Jadi jika sejalan, saya punya:
xxx yyy zzz
Dan pola:
/yyy/
Saya hanya ingin mendapatkan:
yyy
EDIT: berkat kurumi saya berhasil menulis sesuatu seperti ini:
awk '{
for(i=1; i<=NF; i++) {
tmp=match($i, /[0-9]..?.?[^A-Za-z0-9]/)
if(tmp) {
print $i
}
}
}' $1
dan inilah yang saya butuhkan :) terima kasih banyak!
tmp=match($i, /regexp);if(tmp){}
, Anda harus bisa melakukannyaif(tmp ~ $i){}
karena~
artinya "cocok dengan regexp".Jawaban:
Ini yang paling dasar
minta
awk
untuk mencaripattern
menggunakan//
, lalu cetak baris, yang secara default disebut record, dilambangkan dengan $ 0. Setidaknya baca dokumentasi .Jika Anda hanya ingin mencetak kata yang cocok.
sumber
print
tindakan default:awk '/pattern/' file
sudah cukup.for
-loop berfungsi jika (a) "yyy" adalah ekspresi reguler dan bukan string lurus dan (b) jika "yyy" itu tidak cocok dengan seluruh bidang di dalamnya rekor.$i=="yyy"
; itu akan menjadi$i ~ /yyy/
ekspresi reguler.Sepertinya Anda mencoba meniru
grep -o
perilaku GNU . Ini akan melakukannya asalkan Anda hanya menginginkan pertandingan pertama di setiap baris:Berikut adalah contoh, menggunakan
awk
implementasi GNU (melongo):Baca tentang
match
,substr
,RSTART
danRLENGTH
diawk
manual.Setelah itu Anda mungkin ingin memperpanjang ini untuk menangani beberapa pertandingan di baris yang sama.
sumber
gawk bisa mendapatkan bagian yang cocok dari setiap baris menggunakan ini sebagai tindakan:
sumber
Jika Anda hanya tertarik pada baris masukan terakhir dan Anda berharap hanya menemukan satu kecocokan (misalnya bagian dari baris ringkasan dari perintah shell), Anda juga dapat mencoba kode yang sangat ringkas ini, yang diadopsi dari Cara mencetak kecocokan regexp menggunakan `awk`? :
Atau versi yang lebih kompleks dengan hasil parsial:
Peringatan:
awk
match()
fungsi dengan tiga argumen hanya ada digawk
, bukan dimawk
Berikut adalah solusi bagus lainnya menggunakan ekspresi reguler di belakang
grep
sebagai gantiawk
. Solusi ini memiliki persyaratan yang lebih rendah untuk instalasi Anda:sumber
Jika Perl adalah sebuah opsi, Anda dapat mencoba ini:
Untuk menerapkan pencocokan tidak peka huruf besar / kecil, tambahkan
i
pengubahUntuk mencetak semuanya SETELAH pertandingan:
Untuk mencetak pertandingan dan segalanya setelah pertandingan:
sumber
Menggunakan sed juga bisa menjadi elegan dalam situasi ini. Contoh (ganti baris dengan grup yang cocok "yyy" dari baris):
Halaman manual yang relevan: https://www.gnu.org/software/sed/manual/sed.html#Back_002dreferences-and-Subexpressions
sumber
sed -n 's/^.*\(yyy\).*$/\1/gp' < testfile
Di luar topik, ini juga dapat dilakukan dengan menggunakan grep, cukup posting di sini jika ada yang mencari solusi grep
sumber
Jika Anda tahu di kolom mana teks / pola yang Anda cari (misalnya "yyy"), Anda dapat memeriksa kolom tertentu untuk melihat apakah cocok, dan mencetaknya.
Misalnya, diberikan file dengan konten berikut, (disebut asdf.txt )
untuk hanya mencetak kolom kedua jika cocok dengan pola "yyy", Anda dapat melakukan sesuatu seperti ini:
Perhatikan bahwa ini juga akan cocok pada dasarnya semua baris yang kolom kedua memiliki "yyy" di dalamnya, seperti ini:
sumber