Mar 15, 2012

Sức mạnh của biểu thức chính quy trong Linux (Phần 2)

Phần trước chúng ta đã đề cập đến một số cú pháp cơ bản của biểu thức chính quy, trong phần tiếp theo này, chúng ta sẽ xét thêm một số ví dụ cơ bản khác và sau đó sẽ đề cập đến một số ứng dụng cơ bản trong việc xây dựng mẫu lọc cho Egrep.



Liệt kê một số biểu thức:




























































Word boundaries
\bkhớp tại các vị trí nằm giữa một ký tự word (là ký tự khớp với \w) và một ký tự không phải word (khớp với \W hoặc [\w]), kể cả vị trí bắt đầu hoặc kết thúc chuỗi nếu các vị trí đó là ký tự word.\b khớp g trong cuong
.\b sẽ khớp e và u trong love\tyou
\BKhớp tại vị trí nằm giữa 2 ký tự word hoặc các vị trí năm giữa 2 ký tự không phải word.\B.\B khớp với v,n,x trong _vnu(x)

Sự lựa chọn
| (pipe)lựa chọn giữa 2 thành phần bên trái hoặc bên phải dấu |Abc | def khớp với Abc hoặc def
abc(def | xyz) khớp với abcdef hoặc abcxyz

Định lượng
? (question mark)có xuất hiện hoặc khôngAbc? khớp với Ab hoặc Abc
* (star)xuất hiện 0 hoặc nhiều lần_.* khớp với _count trong if _count > 1
+ (plus)xuất hiện 1 hoặc nhiều lần.(ab)+ khớp với lab trong this is a lab.
{n} với n >=1, n nguyênxuất hiện chính xác n lầnr{2} khớp với blackberry trong This is a blackberry phone.
{min, max} với min, max nguyên dương, max >= minxuất hiện ít nhất min lần, nhiều nhất max lầnWw{2,4} khớp với Www, Wwww, Wwwww
{min,}Xuất hiện tối thiểu min lầnWw{2,} khớp với Www, Wwww, …


 Egrep là viết tắt của "Extended Global Regular Expressions Print", cùng với các tiện ích lọc như grep, fgrep, rgrep,... tạo nên một bộ filter rất thông dụng của *NIX. Các tiện ích này có chung chức năng chính là lọc từng dòng trong một file chỉ định để tìm ra dòng nào chứa mẫu tìm kiếm. Ngoài cách gọi tường minh egrep, bạn cũng có thể dùng grep -e .


Sau đây chúng ta cùng điểm qua một vài điểm cần lưu ý riêng cho filter này :






































ký hiệuý nghĩa
Cký tự C thông thường
\cescape ký tự c nếu c là ký tự đặc biệt
^đánh dấu đầu dòng
$đánh dấu cuối dòng
. * + ?như đã đề cập trong phần biểu thức chính quy
(a)với a là một biểu thức
\n (n là số nguyên dương)tham chiếu tới xâu con được mô tả trong cặp ngoặc đơn thứ n tính từ đầu biểu thức chính quy


Ví dụ minh họa :




    • Bắt đầu bằng ký tự a sau đó là bất kỳ ký tự nào



egrep “( |^)a.*” filename;



    • Bắt đầu bằng hoặc ký tự a, ký tự b hoặc c, sau đó là bất kỳ ký tự nào.



egrep “( |^)[abc].*” filename



    • Không bắt đầu bằng ký tự a, b và c, sau đó có thể là bất kỳ ký tự nào



egrep ‘( |^)[^abc].*’ filename



    • Đầu dòng là ký tự a, sau đó là bất kỳ ký tự nào



grep “^a.*” filename



    • Toàn là ký tự a



egrep “( |^)aa*( |$)” filename



    • Tìm các từ bắt đầu bằng chữ a, sau đó là một hoặc 3 chữ c và kết thúc bằng chữ d



egrep “( |^)a(c|ccc)[^c]*d( |$)” filename



    • Tìm kiếm các địa chỉ email xuất hiện trong nội dung của văn bản. Địa chỉ email thường có định dạng: username@domain.country, trong đó domain có thể có nhiều cấp (ví dụ: mail.vnu.edu, cũng có thể chỉ có 1 cấp như microsoft; country là mã đại diện cho tên nước hay một địa chỉ cấp 1 nào đó chẳng hạn như vn, kr, th, sg, com, net,…



egrep “( |^)[a-zA-Z]+[a-zA-Z0-9]*@([a-z0-9]+.){1,}[a-z]+( |$)” filename



    • Tìm kiếm các địa chỉ MAC của card mạng máy tính trong văn bản (ví dụ về một địa chỉ MAC là 00-1F-29-8D-98-39)



egrep “( |^)([0-9A-F]{2,2}-){5,5}[0-9A-F]{2,2}( |$)” filename



    • Tìm kiếm các số điện thoại di động của Viettel xuất hiện trong văn bản



Mẫu:

098/097/0168/0169/0166x.xxx.xxx

Ghi chú: ứng với mỗi mẫu sẽ cần cho thêm một biểu thức chính quy

egrep “( |^)(097|098|0166|0168|0169)[0-9](\.[0-9]{3,3}){2,2}( |$)” filename




    • Tìm kiếm tất cả các ngày (viết dưới dạng các ký số, ví dụ 30/12/09) xuất hiện trong văn bản



egrep “( |^)([0-9]{2,2}/){2,2}[0-9]{2,2}( |$)” filename



    • Tìm kiếm tất cả các biểu thức thời gian (viết dưới dạng các ký số, ví dụ 10:30) xuất hiện trong văn bản



egrep “( |^)[0-9]{2,2}:[0-9]{2,2}” filename



    • Tìm kiếm các URL xuất hiện trong văn bản



egrep “( |^)(http|ftp)://([a-z0-9]+\.){1,}[a-z]+( |$)” filename



    • Tìm kiếm các địa chỉ IP xuất hiện trong văn bản

    • Tìm kiếm danh sách các thẻ HTML xuất hiện trong văn bản



egrep “()|()|()” filename

No comments:

Post a Comment