Linux biểu thức thông thường bằng cách sử dụng Sed và AWK
Bài đăng này đã không được cập nhật trong 6 năm
Bài báo được dịch từ nguồn: Linux regex examples
Để thành công khi làm việc với trình biên tập Linux sed và lệnh awk trong các kịch bản shell của bạn, bạn phải hiểu các biểu thức thông thường hoặc trong regex ngắn. Vì có rất nhiều công cụ cho regex, nên chúng ta sẽ sử dụng regex shell và xem sức mạnh bash khi làm việc với regex.
Trước tiên, chúng ta cần phải hiểu regex là gì, sau đó chúng ta sẽ thấy làm thế nào để sử dụng nó. 1 regex là gì 2 loại regex 3 Xác định các mẫu BRE 4 ký tự đặc biệt 5 nhân vật Anchor 6 Dấu chấm Ký tự 7 lớp nhân vật 8 Tiêu cực các lớp nhân vật 9 Sử dụng dãy 10 Lớp nhân vật đặc biệt
Regex là gì
Đối với một số người, khi họ nhìn thấy các biểu hiện thông thường lần đầu tiên họ nói những gì là những chiếc ASCII pukes !!
Vâng, Một biểu thức chính quy hoặc regex, nói chung, là một mẫu văn bản mà bạn xác định rằng một chương trình Linux như sed hay awk sử dụng nó để lọc văn bản.
Chúng ta đã thấy một số trong những mô hình này khi giới thiệu các lệnh Linux cơ bản và thấy cách lệnh ls sử dụng ký tự đại diện để lọc đầu ra.
Các loại regex
Có rất nhiều ứng dụng khác nhau sử dụng các loại regex khác nhau trong Linux, như regex bao gồm trong các ngôn ngữ lập trình (Java, Perl, Python ,,,) và các chương trình Linux như (sed, awk, grep,) và nhiều ứng dụng khác.
Một mẫu regex sử dụng một công cụ biểu thức chính quy để dịch các mẫu đó.
Linux có hai công cụ biểu thức chính quy:
Công cụ Biểu thức Thường xuyên cơ bản (Basic Regular Expression - BRE). Công cụ Express Regular Expression (ERE). Hầu hết các chương trình Linux hoạt động tốt với các chi tiết kỹ thuật của công cụ BRE, nhưng một số công cụ như sed hiểu một số quy tắc của công cụ BRE.
Công cụ POSIX ERE được vận chuyển với một số ngôn ngữ lập trình. Nó cung cấp nhiều mẫu hơn như kết hợp các chữ số và từ. Lệnh awk sử dụng công cụ ERE để xử lý các mẫu biểu thức chính quy của nó.
Vì có nhiều hiện thực regex, rất khó để viết các mẫu hoạt động trên tất cả các động cơ. Do đó, chúng tôi sẽ tập trung vào các regex phổ biến nhất và chứng minh làm thế nào để sử dụng nó trong sed và awk.
Xác định các mẫu BRE
Bạn có thể xác định một mẫu phù hợp với văn bản như sau:
$ echo "Testing regex using sed" | sed -n '/regex/p'
$ echo "Testing regex using awk" | awk '/regex/{print $0}'
Bạn có thể nhận thấy rằng regex không quan tâm nơi mẫu xảy ra hoặc bao nhiêu lần trong luồng dữ liệu.
Quy tắc đầu tiên cần biết là các mẫu biểu thức chính quy phân biệt chữ hoa chữ thường.
$ echo "Welcome to LikeGeeks" | awk '/Geeks/{print $0}'
$ echo "Welcome to Likegeeks" | awk '/Geeks/{print $0}'
Regex đầu tiên thành công vì từ "Geeks" tồn tại trong trường hợp trên, trong khi dòng thứ hai không thành công vì nó sử dụng các chữ cái nhỏ.
Bạn có thể sử dụng dấu cách hoặc số trong mẫu của bạn như sau:
$ echo "Testing regex 2 again" | awk '/regex 2/{print $0}'
Nhân vật đặc biệt
các mẫu regex sử dụng một số ký tự đặc biệt. Và bạn không thể đưa chúng vào các mẫu của bạn và nếu bạn làm như vậy, bạn sẽ không nhận được kết quả mong đợi.
Những ký tự đặc biệt này được công nhận bởi regex:
.*[]^${}\+?|()
Bạn cần phải thoát khỏi những nhân vật đặc biệt này bằng cách sử dụng ký tự dấu gạch chéo ngược ().
Ví dụ: nếu bạn muốn kết hợp ký hiệu đô la ($), hãy thoát nó bằng ký tự dấu gạch chéo ngược như sau:
$ cat myfile
There is 10$ on my pocket
$ awk '/\$/{print $0}' myfile
Nếu bạn cần phải khớp dấu gạch chéo ngược (), bạn cần phải thoát nó như sau:
$ echo "\ is a special character" | awk '/\\/{print $0}'
Mặc dù dấu gạch chéo không phải là ký tự đặc biệt, bạn vẫn gặp phải lỗi nếu sử dụng trực tiếp.
$ echo "3 / 2" | awk '///{print $0}'
Vì vậy, bạn cần phải thoát khỏi nó như thế này:
$ echo "3 / 2" | awk '/\//{print $0}'
Nhân vật Anchor
Để xác định vị trí bắt đầu của một dòng trong một văn bản, sử dụng ký tự dấu phân cách (^).
Bạn có thể sử dụng nó như thế này:
$ echo "welcome to likegeeks website" | awk '/^likegeeks/{print $0}'
$ echo "likegeeks website" | awk '/^likegeeks/{print $0}'
Ký tự dấu phẩy (^) khớp với phần bắt đầu của văn bản:
$ awk '/^this/{print $0}' myfile
Nếu bạn sử dụng nó ở giữa văn bản thì sao?
$ echo "This ^ caret is printed as it is" | sed -n '/s ^/p'
Nó được in giống như một nhân vật bình thường.
Khi sử dụng awk, bạn phải thoát nó như sau:
$ echo "This ^ is a test" | awk '/s \^/{print $0}'
Đây là về nhìn vào đầu văn bản, còn nhìn về phía cuối thì sao?
Dấu đô la ( echo "Testing regex again" | awk '/again$/{print $0}'` Bạn có thể sử dụng dấu caret và dollar trên cùng một dòng như sau:
$ cat myfile
this is a test
This is another test
And this is one more
$ awk '/^this is a test$/{print $0}' myfile
Như bạn thấy, nó chỉ in chỉ dòng chỉ có mẫu kết hợp.
Bạn có thể lọc các dòng trống bằng mẫu sau:
$ awk '!/^$/{print $0}' myfile
Ở đây chúng tôi giới thiệu sự phủ nhận được thực hiện bởi dấu chấm than!
Mẫu tìm kiếm các dòng rỗng mà không có gì giữa đầu và cuối của dòng và phủ nhận rằng để in chỉ những dòng có văn bản.
Tôi hy vọng bạn tìm thấy bài viết hữu ích. Chúc may mắn.
All rights reserved