Cách dùng Awk và Regular expression để lọc văn bản file Linux

Trong bài này mình sẽ hướng dẫn cách sử dụng Regular Expression và Awk để lọc văn bản của file trong Linux. Awk là kiến thức nâng cao nên phù hợp với người rành Linux.

Khi mình chạy các lệnh nhất định trong Linux để đọc hoặc chỉnh sửa file, mình thường cố gắng lấy đoạn văn bản mà mình quan tâm nhất. Đây là lúc việc sử dụng Regular Expression và awk trở nên hữu ích.

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Và để đọc và hiểu được bài này thì bạn phải có một chút kiến thức về quản trị Linux nhé, vì mọi dòng lệnh đều được thực hiện trên Terminal.

I. Regular Expression là gì?

Regular Expression có thể được định nghĩa như là đại diện của một vài kí tự đặc biệt. Và một trong những điều quan trọng nhất khi nói về Regular Expression là nó cho phép lọc output của câu lệnh hoặc trong một file, có thể chỉnh sửa như là một phần của đoạn văn bản hoặc file cấu hình.

Không chỉ có ở Linux, khái niệm RegExp được sử dụng ở hầu hết các ngôn ngữ lập trình hiện nay, bởi nó là một module được cài vào trình biên dịch của các ngôn ngữ đó.

II. Các tính năng của Regular Expression trong Linux

Những thành phần cấu tạo lên:

Kí tự bình thường: như là khoảng cách, gạch dưới ( _ ), A-Z, a-z, 0-9.

Kí tự meta: là một phần mở rộng của ký tự bình thường.

  • ( . ) khớp với bất kì kí tự nào trừ khoảng cách.
  • ( * ) khớp với không ký tự nào hoặc ký tự đứng ngay trước nó.
  • [ character(s) ] khớp với khoảng chỉ định trong character(s), người ta có thể sử dụng dấu ( - ) như một khoảng ký tự như từ a đến z (a - z ) hoặc từ 0 đến 5 ( 0 - 5).
  • ( ^ ) khớp với đoạn đầu của dòng.
  • ( $ ) khớp với đoạn cuối của dòng.
  • ( \ ) khớp với kí tự escape

Lý thuyết thì sẽ hơi khó hiểu một chút nhưng mình sẽ giải thích chi tiết ở dưới.

Để lọc văn bản, chúng ta phải sử dụng công cụ lọc văn bản như awk , bạn có thể hình dung awk như một ngôn ngữ lập trình của chính nó. Nhưng trong phạm vi bài hướng dẫn này, chúng tôi sẽ đề cập đến nó như một câu lệnh command line đơn giản.

Cú pháp chung của awk là:

awk 'script' filename

Trong đó script là một trong những câu lệnh của awk chúng được dùng để thực thi câu lệnh (execute) trong file đó.

Nó hoạt động bằng cách đọc dòng hiện tại copy dòng đó và thực hiện các câu lệnh trên dòng mới. Nó lặp đi lặp lại trên tất cả các dòng của file.

Script là dạng regular expression awk sẽ tìm tất cả các dạng pattern được tìm thấy trong file.

III. Cách sử dụng công cụ lọc Awk

Như các ví dụ trên, chúng ta sẽ tập trung vào các kí tự meta mà chúng ta đề cập.

Ví dụ đơn giản khi sử dụng awk

Ví dụ ở dưới ta sẽ in tất cả câu dòng trong file /etc/hosts .

awk '//{print}' /etc/hosts

awk 1 png

In ra các dòng có khớp với pattern /localhost/

awk '/localhost/{print}' /etc/hosts

awk 2 png

Sử dụng awk cùng với kí tự meta ( . ) trong pattern

Kí tự ( . ) nó sẽ khớp với các chuỗi chứa loc, localhost, nó sẽ như là đại diện cho một ký tự bất kì mà không phải khoảng cách.

awk '/l.c/{print}' /etc/hosts

awk 3 png

Sử dụng ký tự meta ( * ) trong pattern

pattern dưới nó sẽ khớp với toàn bộ ký tự chứa localhost,...

awk '/l*c/{print}' /etc/hosts

awk 4 png

Bạn có thể nhận ra rằng kí tự meta ( * ) cố gắng lấy được đoạn dài nhất mà khớp với pattern /l*c/

Hãy nhìn vào trường hợp sau đây để chứng minh điều đó, pattern /t*t/ nghĩa là bắt đầu bằng chữ t và kết thúc bằng chữ t trong ví dụ sau:

awk 5 png

Có rất nhiều đoạn match với bắt đầu bằng chữ t và kết thúc bằng chữ t:

awk 6 png

Nhưng với awk ta sẽ lấy đoạn dài nhất, ta có câu lệnh:

awk '/t*t/{print}' test.txt

awk 7 png

Sử dụng awk với [ character(s) ]

Ta lấy một ví dụ như pattern /[9p]/. Awk sẽ khớp với tất cả ký tự nào có chứa 9 hoặc là p trong file /etc/hosts

awk '/[9p]/{print}' /etc/hosts

awk 8 png

Ở ví dụ tiếp theo ta sẽ bắt đầu bằng một ký tự p hoặc là ký tự g tiếp theo là ký tự r

awk '/[pg]r/{print}' /etc/hosts

awk 9 png

Chỉ định các ký tự nằm trong một phạm vi

Và trước hết ta phải hiểu một vài khoảng hay dùng trong awk:

  • [0-9]: nghĩa là một số duy nhất
  • [a-z]: nghĩa là một chữ cái viết thường
  • [A-Z]: nghĩa là một chữ cái viết hoa
  • [a-zA-Z]: nghĩa là một chữ cái không phân biệt hoa thường
  • [a-zA-Z0-9]: nghĩa là một chữ cái không phân biệt hoa thường hoặc là một số nào đó

Một vài ví dụ minh hoạ:

awk '/[0-9]/{print}' /etc/hosts

awk 10 png

Tất cả các dòng trong file /etc/hosts chứa ít nhất là một số từ 0 đến 9 đều được in ra.

Sử dụng awk cùng với ký tự ( ^ )

Ta bắt đầu bằng với pattern đơn giản sau:

awk '/^13/{print}' /etc/hosts

Nó sẽ match tất cả cả dòng bắt đầu bằng ký tự 13

awk 11 png

Sử dụng awk cùng với ký tự ( $ )

ta cũng bắt đầu bằng pattern sau để hiểu rõ hơn.

awk '/com$/{print}' /etc/hosts

Ta sẽ tìm tất cả các dòng sao cho ký tự cuối là com

awk 12 png

Sử dụng awk cùng với ký tự escape ( \ )

Ký tự ( \ ) được sử dụng khi bạn muốn tìm ra những ký tự nhưng mà ký tự ấy lại bao gồm những ký tự meta. Ví dụ bạn muốn tìm ra đoạn có ký tự “ $25 “. ví dụ:

Mình có file escape.txt như sau:

awk 13 png

awk '/$25.00/{print}' escape.txt # =>> không tìm được
awk '/\$25.00/{print}' escape.txt # =>> tìm được

awk 14 png

các bạn có thể cùng thực hành bằng các file trong git như sau: https://github.com/AnTienTL/awk-learning

Tổng kết

Qua những ví dụ trên ta đã tìm hiểu được căn bản về awk. Những bài sau mình sẽ giới thiệu về những tính năng xịn sò của awk và những trường hợp nào nên dùng. Cảm ơn các bạn đã đọc.

Cùng chuyên mục:

Cách dùng lệnh Users trong Linux để xem user đang online

Cách dùng lệnh Users trong Linux để xem user đang online

Nếu bạn đang là quản trị viên thì việc quản lý thông tin / xem…

Cách sử dụng lệnh Wall trong Linux

Cách sử dụng lệnh Wall trong Linux

Wall là một công cụ dòng lệnh giúp hiển thị thông báo đến tất cả…

Cách dùng lệnh Whereis trong Linux

Cách dùng lệnh Whereis trong Linux

Whereis là một tiện ích dòng lệnh command line, nó cho phép bạn tìm ..

Cách sử dụng lệnh Which trong Linux

Cách sử dụng lệnh Which trong Linux

Linux dùng lệnh which để xác định vị trí file thực thi của lệnh mà…

Cách sử dụng lệnh whoami trong Linux

Cách sử dụng lệnh whoami trong Linux

Giống như tên gọi của nó, lệnh whoami in tên người dùng đang chạy ...

Cách dùng lệnh zcat trong Linux

Cách dùng lệnh zcat trong Linux

Mặc dù tính năng nén file rất hữu ích vì nó giúp ta tiết kiệm…

Hiểu rõ hơn về chmod 777 trong Linux

Hiểu rõ hơn về chmod 777 trong Linux

Bạn đang xây dựng một website và sử dụng tính năng upload ...

Cách sử dụng lệnh tail trong Linux

Cách sử dụng lệnh tail trong Linux

Mặc định thì lệnh tail sẽ hiển thị 10 dòng cuối cùng của file, thông…

Cách sử dụng lệnh Head trong Linux

Cách sử dụng lệnh Head trong Linux

Trong quá trình quản trị dữ liệu trên Linux đôi khi bạn muốn xem nhanh…

Cách sử dụng lệnh Whatis trong Linux

Cách sử dụng lệnh Whatis trong Linux

Trong bài này chúng ta sẽ tìm hiểu lệnh whatis trong ...

Cách sử dụng lệnh kill trong Linux

Cách sử dụng lệnh kill trong Linux

Linux là một hệ điều hành rất nhanh nhưng không phải lúc nào nó không…

Cách dùng lệnh who trong Linux

Cách dùng lệnh who trong Linux

Who là một công cụ dòng lệnh command-line, được ...

Cách dùng lệnh basename trong Linux

Cách dùng lệnh basename trong Linux

basename là một tiện ích dòng lệnh (command line) dùng để lấy ...

Cách sử dụng lệnh gzip trên Linux

Cách sử dụng lệnh gzip trên Linux

Gzip là một trong những thuật toán nén file phổ biến nhất, nó cho phép…

Cách dùng lệnh wait trong Linux

Cách dùng lệnh wait trong Linux

Wait là lệnh dùng để đợi một thời gian cho tới khi công việc nào…

Cách dùng lệnh ping trong Linux

Cách dùng lệnh ping trong Linux

Lệnh ping là một trong những công cụ được sử dụng nhiều nhất để khắc…

Cách dùng lệnh sleep trong Linux

Cách dùng lệnh sleep trong Linux

sleep là một tiện ích command line cho phép lập trình viên ..

Các ví dụ học Bash Script trong Linux cơ bản nhất

Các ví dụ học Bash Script trong Linux cơ bản nhất

Bash Script đuọc xem là mã code lập trình trên Linux ...

Vòng lặp until trong Shell Script

Vòng lặp until trong Shell Script

Vòng lặp while trong Shell Script

Vòng lặp while trong Shell Script

Trong Linux script, vòng lặp while được sử dụng trong ...

Top