Tin tức và phân tích của tất cả các thiết bị di động

Làm thế nào để sử dụng chúng một cách hiệu quả?

Nếu bạn đã sử dụng Linux được một thời gian thì bạn đã biết về grep – Global Regular Expression Print, một công cụ xử lý văn bản mà bạn có thể sử dụng để tìm kiếm các tập tin và thư mục. Nó rất hữu ích trong tay người dùng Linux nâng cao. Tuy nhiên, việc sử dụng nó mà không có biểu thức chính quy có thể hạn chế khả năng của nó.

Nhưng biểu thức chính quy là gì?

Regex là các biểu thức chính quy mà bạn có thể sử dụng để nâng cao chức năng tìm kiếm của grep. Regex theo định nghĩa là một mẫu lọc đầu ra nâng cao. Khi thực hành, bạn có thể sử dụng các biểu thức chính quy một cách hiệu quả vì bạn cũng có thể sử dụng chúng với các lệnh Linux khác.

Trong hướng dẫn này, chúng ta sẽ học cách sử dụng Grep và Regex một cách hiệu quả.

Điều kiện tiên quyết

Sử dụng grep với biểu thức chính quy đòi hỏi phải có hiểu biết tốt về Linux. Nếu bạn là người mới bắt đầu, hãy xem hướng dẫn về Linux của chúng tôi.

Bạn cũng cần truy cập vào máy tính xách tay hoặc máy tính có hệ điều hành Linux. Bạn có thể sử dụng bất kỳ bản phân phối Linux nào bạn chọn. Và nếu bạn có một máy tính đang chạy Windows, bạn vẫn có thể sử dụng Linux với WSL2. Kiểm tra chi tiết của chúng tôi về nó ở đây.

Quyền truy cập dòng lệnh/thiết bị đầu cuối cho phép bạn chạy tất cả các lệnh được đưa ra trong hướng dẫn grep/regex của chúng tôi.

Ngoài ra, bạn cũng cần truy cập vào các tệp văn bản mà bạn sẽ cần để chạy các ví dụ. Tôi đã sử dụng ChatGPT để tạo một bức tường văn bản yêu cầu anh ấy viết về công nghệ. Lời nhắc tôi đã sử dụng như sau.

“Tạo ra 400 từ về công nghệ. Nó nên chứa hầu hết các công nghệ. Ngoài ra, hãy đảm bảo bạn lặp lại tên công nghệ xuyên suốt.”

Sau khi tạo văn bản, tôi đã sao chép và lưu nó vào tệp tech.txt mà chúng ta sẽ sử dụng trong suốt hướng dẫn.

Cuối cùng, kiến ​​thức cơ bản về lệnh grep là điều bắt buộc. Bạn có thể xem 16 ví dụ về lệnh grep để nâng cao kiến ​​thức của mình. Trước tiên chúng tôi cũng sẽ giới thiệu ngắn gọn về lệnh grep.

Cú pháp và ví dụ Grep

Cú pháp grep rất đơn giản.

$ grep -options [regex/pattern] [files]

Như bạn có thể thấy, nó mong đợi một mẫu và danh sách các tệp mà bạn muốn chạy lệnh.

Có nhiều tùy chọn grep có sẵn để sửa đổi chức năng của nó. Chúng bao gồm:

  • – i: bỏ qua các trường hợp
  • -r: thực hiện tìm kiếm đệ quy
  • -w: thực hiện tìm kiếm để chỉ tìm toàn bộ từ
  • -v: hiển thị tất cả các dòng không khớp
  • -n: hiển thị tất cả các số dòng phù hợp
  • -l: in tên file
  • –color: bản in màu của kết quả
  • -c: hiển thị số lượng kết quả khớp cho mẫu được sử dụng

# 1. Tìm kiếm toàn bộ từ

Bạn sẽ phải sử dụng đối số -wz grep để tìm kiếm toàn bộ từ. Bằng cách sử dụng nó, bạn bỏ qua tất cả các chuỗi khớp với mẫu đã cho.

$ grep -w ‘tech\|5G’ tech.txt

Như bạn có thể thấy, lệnh tạo ra một kết quả trong đó nó tìm kiếm hai từ “5G” và “tech” trong toàn bộ văn bản. Sau đó, nó đánh dấu chúng bằng màu đỏ.

Đây | ký hiệu ống được thay đổi để grep không xử lý nó dưới dạng siêu ký tự.

Để thực hiện tìm kiếm không phân biệt chữ hoa chữ thường, hãy sử dụng grep với đối số -i.

$ grep -i ‘tech’ tech.txt

Lệnh tìm kiếm bất kỳ sự xuất hiện không phân biệt chữ hoa chữ thường của “công nghệ”, cho dù đó là toàn bộ từ hay một phần của từ đó.

Để liệt kê tất cả các dòng không chứa mẫu nhất định, bạn phải sử dụng đối số -v.

$ grep -v ‘tech’ tech.txt

Đầu ra hiển thị tất cả các hàng không chứa từ “tech”. Bạn cũng sẽ thấy các dòng trống. Những dòng này là những dòng sau đoạn văn.

Để thực hiện tìm kiếm đệ quy, hãy sử dụng đối số -rz grep.

$ grep -R ‘error\|warning’ /var/log/*.log
#output

/var/log/bootstrap.log:2023-01-03 21:40:18 URL:http://ftpmaster.internal/ubuntu/pool/main/libg/libgpg-error/libgpg-erro 0_1.43-3_amd64.deb [69684/69684] -> "/build/chroot//var/cache/apt/archives/partial/libgpg-error0_1.43-3_amd64.deb" [1]

/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 5 package 'dpkg':

/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 5 package 'dpkg':

/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 24 package 'dpkg':

/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 24 package 'dpkg':

/var/log/bootstrap.log:dpkg: warning: ignoring pre-dependency problem!

Lệnh grep tìm kiếm đệ quy hai từ “lỗi” và “cảnh báo” trong thư mục /var/log. Đây là lệnh hữu ích để tìm hiểu về bất kỳ cảnh báo và lỗi nào trong tệp nhật ký.

Grep và Regex: nó là gì và ví dụ

Vì chúng ta đang làm việc với các biểu thức chính quy nên bạn cần biết rằng các biểu thức chính quy cung cấp ba tùy chọn cú pháp. Chúng bao gồm:

  • Biểu thức chính quy cơ bản (BRE)
  • Biểu thức chính quy mở rộng (ERE)
  • Biểu thức chính quy tương thích với Pearl (PCRE)

Lệnh grep sử dụng BRE làm tùy chọn mặc định. Vì vậy, nếu bạn muốn sử dụng các chế độ biểu thức chính quy khác, bạn cần đề cập đến chúng. Lệnh grep cũng xử lý các siêu ký tự như hiện tại. Vì vậy, nếu bạn sử dụng các siêu ký tự như ?, +, ), bạn sẽ cần phải thoát chúng bằng lệnh dấu gạch chéo ngược (\).

Cú pháp của grep với biểu thức chính quy như sau.

$ grep [regex] [filenames]

Hãy xem grep và biểu thức chính quy hoạt động trong các ví dụ bên dưới.

# 1. So khớp từ theo nghĩa đen

Để thực hiện khớp từ theo nghĩa đen, bạn cần chỉ định một chuỗi làm biểu thức chính quy. Suy cho cùng, từ cũng là một biểu thức chính quy.

$ grep "technologies" tech.txt

Tương tự, bạn cũng có thể sử dụng kết quả khớp theo nghĩa đen để tìm người dùng hiện tại. Chạy vì điều đó

$ grep bash /etc/passwd
#output

root:x:0:0:root:/root:/bin/bash

nitt:x:1000:1000:,,,:/home/nitt:/bin/bash

Điều này sẽ liệt kê những người dùng có thể truy cập bash.

#2. Neo phù hợp

Kết hợp neo là một kỹ thuật tìm kiếm nâng cao hữu ích bằng cách sử dụng các ký tự đặc biệt. Trong biểu thức chính quy, có nhiều ký tự neo khác nhau có thể được sử dụng để thể hiện các vị trí cụ thể trong văn bản. Chúng bao gồm:

  • Dấu mũ “^”: Dấu mũ khớp với phần đầu của chuỗi hoặc dòng đầu vào và tìm kiếm một chuỗi trống.
  • Ký hiệu đô la “$”: Ký hiệu đô la khớp với phần cuối của chuỗi hoặc dòng đầu vào và tìm kiếm chuỗi trống.

Hai ký tự neo phù hợp khác bao gồm ranh giới từ “\b” và ranh giới không phải từ “\B”.

  • Ranh giới từ “\b”: Sử dụng \b để xác định vị trí giữa một từ và ký tự không phải từ. Nói một cách đơn giản, nó cho phép bạn ghép toàn bộ các từ. Bằng cách này có thể tránh được các kết quả trùng khớp một phần. Bạn cũng có thể sử dụng nó để thay thế các từ hoặc đếm số lần xuất hiện của các từ trong một chuỗi.
  • \B ranh giới không phải từ: Điều này trái ngược với ranh giới từ \b trong biểu thức chính quy vì nó cung cấp một vị trí không nằm giữa các ký tự hai từ hoặc không phải từ.

Hãy phân tích các ví dụ để có được một bức tranh rõ ràng.

$ grep ‘^From’ tech.txt

Việc sử dụng dấu mũ yêu cầu từ hoặc công thức phải được nhập với kích thước phù hợp. Điều này là do nó phân biệt chữ hoa chữ thường. Vì vậy, nếu bạn chạy lệnh sau, nó sẽ không trả về gì cả.

$ grep ‘^from’ tech.txt

Tương tự, bạn có thể sử dụng ký hiệu $ để tìm câu khớp với mẫu, chuỗi hoặc từ nhất định.

$ grep ‘technology.$' tech.txt

Bạn cũng có thể kết hợp các ký hiệu ^ và $. Hãy xem ví dụ sau.

$ grep “^From \| technology.$” tech.txt

Như bạn có thể thấy, đầu ra chứa các câu bắt đầu bằng “Từ” và các câu kết thúc bằng “công nghệ”.

#3. Nhóm

Nếu bạn muốn tìm kiếm nhiều mẫu cùng một lúc, bạn cần sử dụng tính năng nhóm. Nó giúp tạo ra các nhóm nhỏ các ký tự và mẫu có thể được xử lý một cách tổng thể. Ví dụ: bạn có thể tạo một nhóm (công nghệ) có chứa thuật ngữ “t”, “e”, “c”, “h”.

Để có được một bức tranh rõ ràng, chúng ta hãy xem một ví dụ.

$ grep 'technol\(ogy\)\?' tech.txt

Với tính năng nhóm, bạn có thể khớp các mẫu lặp lại, nắm bắt các nhóm và tìm kiếm các lựa chọn thay thế.

Tìm kiếm thay thế bằng cách nhóm

Hãy xem một ví dụ về tìm kiếm thay thế.

$ grep "\(tech\|technology\)" tech.txt

Nếu bạn muốn thực hiện tìm kiếm trên một chuỗi, bạn cần chuyển nó bằng ký hiệu ống. Chúng ta hãy xem nó trong ví dụ dưới đây.

$ echo “tech technological technologies technical” |  grep "\(tech\|technology\)"
#output

“tech technological technologies technical”

Nhóm chụp, nhóm không chụp và mẫu lặp lại

Thế còn các nhóm bắt và không bắt thì sao?

Bạn cần tạo một nhóm trong biểu thức chính quy và chuyển nó vào một chuỗi hoặc tệp để thu thập các nhóm.

$ echo 'tech655 tech655nical technologies655 tech655-oriented 655' | grep "\(tech\)\(655\)"
#output

tech655 tech655nical technologies655 tech655-oriented 655

Và đối với các nhóm không nắm bắt được, bạn cần sử dụng ?: trong ngoặc đơn.

Cuối cùng, chúng ta có các mẫu lặp lại. Bạn cần sửa đổi biểu thức chính quy để kiểm tra các mẫu lặp lại.

$ echo ‘teach tech ttrial tttechno attest’ | grep '\(t\+\)'
#output

‘teach tech ttrial tttechno attest’

Ở đây biểu thức chính quy tìm kiếm một hoặc nhiều lần xuất hiện của ký tự “t”.

#4. Lớp nhân vật

Với các lớp ký tự, bạn có thể dễ dàng viết các biểu thức chính quy. Các lớp ký tự này sử dụng dấu ngoặc vuông. Một số lớp nhân vật nổi tiếng là:

  • [:digit:] – Từ 0 xuống 9 chữ số
  • [:alpha:] – các ký tự của bảng chữ cái
  • [:alnum:] – ký tự chữ và số
  • [:lower:] – lá thư nhỏ
  • [:upper:] – lá thư lớn
  • [:xdigit:] – chữ số thập lục phân, bao gồm 0-9AF, af
  • [:blank:] – ký tự trống, chẳng hạn như tab hoặc dấu cách

Và như thế!

Chúng ta hãy kiểm tra một số trong số họ đang hoạt động.

$ grep [[:digit]] tech.txt

$ grep [[:alpha:]] tech.txt

$ grep [[:xdigit:]] tech.txt

#5. định lượng

Bộ định lượng là siêu ký tự và là cốt lõi của biểu thức chính quy. Chúng cho phép bạn kết hợp chính xác vẻ ngoài. Hãy nhìn vào chúng dưới đây.

  • * → Không có hoặc nhiều kết quả trùng khớp
  • + → một hoặc nhiều trận đấu
  • ? → Không hoặc một trận
  • {x} → x khớp
  • {x, } → x hoặc nhiều kết quả phù hợp
  • {x,z} → từ x đến z khớp
  • {, z} → tới z khớp
$ echo ‘teach tech ttrial tttechno attest’ | grep -E 't+'
#output

‘teach tech ttrial tttechno attest’

Ở đây nó tìm kiếm các trường hợp của “t” cho một hoặc nhiều kết quả phù hợp. Ở đây -E là viết tắt của biểu thức chính quy mở rộng (chúng ta sẽ thảo luận sau).

#6. Biểu thức chính quy mở rộng

Nếu bạn không thích thêm ký tự thoát trong mẫu biểu thức chính quy của mình, bạn cần sử dụng biểu thức chính quy mở rộng. Loại bỏ sự cần thiết phải thêm ký tự thoát. Bạn cần sử dụng cờ -E để thực hiện việc này.

$ grep -E 'in+ovation' tech.txt

#7. Sử dụng PCRE để thực hiện các tìm kiếm phức tạp

PCRE (Biểu thức chính quy tương thích Perl) cho phép nhiều thứ hơn là chỉ viết các biểu thức cơ bản. Ví dụ: bạn có thể viết “\d” có nghĩa là [0-9].

Ví dụ: bạn có thể sử dụng PCRE để tìm kiếm địa chỉ email.

echo "Contact me at [email protected]" | grep -P "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b"
#output

Contact me at [email protected]

Ở đây PCRE cung cấp khả năng khớp mẫu. Tương tự, bạn cũng có thể sử dụng mẫu PCRE để kiểm tra mẫu ngày.

$ echo "The Sparkain site launched on 2023-07-29" | grep -P "\b\d{4}-\d{2}-\d{2}\b"
#output

The Sparkain site launched on 2023-07-29

Lệnh tìm ngày ở định dạng YYYY-MM-DD. Bạn cũng có thể sửa đổi nó cho phù hợp với định dạng ngày khác.

#8. luân phiên

Nếu bạn muốn các kết quả khớp thay thế, bạn có thể sử dụng các ký tự ống thoát (\|).

$ grep -L ‘warning\|error’ /var/log/*.log
#output

/var/log/alternatives.log

/var/log/bootstrap.log

/var/log/dpkg.log

/var/log/fontconfig.log

/var/log/ubuntu-advantage.log

/var/log/upgrade-policy-changed.log

Đầu ra chứa tên tệp chứa “cảnh báo” hoặc “lỗi”.

những từ cuối

Điều này đưa chúng ta đến phần cuối của hướng dẫn về grep và biểu thức chính quy. Bạn có thể sử dụng grep rộng rãi với các biểu thức thông thường để thu hẹp tìm kiếm của mình. Khi sử dụng đúng cách, bạn có thể tiết kiệm rất nhiều thời gian và tự động hóa nhiều tác vụ, đặc biệt nếu bạn sử dụng chúng để viết tập lệnh hoặc sử dụng biểu thức thông thường để tìm kiếm trong văn bản.

Sau đó hãy xem Câu hỏi thường gặp và câu trả lời trong cuộc phỏng vấn Linux.