Sử dụng grep (và egrep) với Biểu thức chính quy

Using Grep With Regular Expressions



Hướng dẫn này mô tả cách sử dụng cả hai nắm chặt (và egrep) t o tìm văn bản trong tệp, ở dạng đơn giản của chúng và khi được kết hợp với biểu thức chính quy. Nó chứa một số ví dụbài tập , hơn các giải pháp , để người xem hoàn thành.

Tên nắm chặt xuất phát từ lệnh ed (và vim) g / re / p, có nghĩa là tìm kiếm toàn cục cho một biểu thức chính quy nhất định và in (hiển thị) kết quả đầu ra.







Thường xuyên Biểu thức

Các tiện ích cho phép người dùng tìm kiếm các tệp văn bản cho các dòng khớp với một biểu thức chính quy ( regexp ). Biểu thức chính quy là một chuỗi tìm kiếm được tạo thành từ văn bản và một hoặc nhiều trong số 11 ký tự đặc biệt. Một ví dụ đơn giản là khớp với đầu dòng.



Tệp mẫu

Dạng cơ bản của nắm chặt có thể được sử dụng để tìm văn bản đơn giản trong một tệp hoặc các tệp cụ thể. Để thử các ví dụ, trước tiên hãy tạo tệp mẫu.



Sử dụng trình chỉnh sửa như nano hoặc vim để sao chép văn bản bên dưới vào một tệp có tên tập tin của tôi .





XYZ
xyzde
exyzd
dexyz
d? gxyz
xxz
xzz
x z
x * z
xz
x z
XYZ
XYYZ
XYZ
xyyz
xyyyz
xyyyyz

Mặc dù bạn có thể sao chép và dán các ví dụ trong văn bản (lưu ý rằng dấu ngoặc kép có thể không sao chép đúng cách), nhưng các lệnh cần được nhập để học chúng đúng cách.

Trước khi thử các ví dụ, hãy xem tệp mẫu:



$con mèotập tin của tôi

Tìm kiếm đơn giản

Để tìm văn bản ‘xyz’ trong tệp, hãy chạy như sau:

$nắm chặtxyz myfile

Sử dụng màu sắc

Để hiển thị màu sắc, hãy sử dụng –color (dấu gạch ngang kép) hoặc chỉ cần tạo một bí danh. Ví dụ:

$nắm chặt --màu sắcxyz myfile

hoặc

$bí danh nắm chặt= ’nắm chặt--màu sắc'
$nắm chặtxyz myfile

Tùy chọn

Các tùy chọn phổ biến được sử dụng với nắm chặt lệnh bao gồm:

  • -tôi tìm tất cả các dòng không phân biệt trường hợp
  • -NS đếm có bao nhiêu dòng chứa văn bản
  • -n dòng hiển thị con số trong số các dòng phù hợp
  • -l chỉ hiển thị tập tin những cái tên trận đấu đó
  • -NS đệ quy tìm kiếm các thư mục con
  • -v tìm tất cả các dòng KHÔNG PHẢI chứa văn bản

Ví dụ:

$nắm chặt -tôixyz myfile# tìm văn bản không phân biệt chữ hoa

$nắm chặt -icxyz myfile# đếm dòng có văn bản

$nắm chặt -trongxyz myfile# hiển thị số dòng

Tạo nhiều tệp

Trước khi cố gắng tìm kiếm nhiều tệp, trước tiên hãy tạo một số tệp mới:

$quăng điXYZ>myfile1
$quăng đi -Vàxyz nxzz nXYZ>myfile2
$quăng đi -Vàxxx nyyy>myfile3
$con mèomyfile1
$con mèomyfile2
$con mèomyfile3

Tìm kiếm nhiều tệp

Để tìm kiếm nhiều tệp bằng tên tệp hoặc ký tự đại diện, hãy nhập:

$nắm chặt -icxyz myfile myfile1 myfile2 myfile3
$nắm chặt -trongxyz của tôi*
# khớp với tên tệp bắt đầu bằng ‘của tôi’

Bài tập I

  1. Đầu tiên hãy đếm xem có bao nhiêu dòng trong tệp / etc / passwd.
Gợi ý: sử dụngwc -NS /Vân vân/passwd
  1. Bây giờ tìm tất cả các lần xuất hiện của văn bản ở đâu trong tệp / etc / passwd .
  2. Tìm bao nhiêu dòng trong tệp chứa văn bản
  3. Tìm bao nhiêu dòng KHÔNG chứa văn bản ở đâu .
  4. Tìm mục nhập để đăng nhập của bạn trong / etc / passwd

Lời giải bài tập có thể được tìm thấy ở cuối bài viết này.

Sử dụng Biểu thức Chính quy

Lệnh nắm chặt cũng có thể được sử dụng với các cụm từ thông dụng bằng cách sử dụng một hoặc nhiều trong số mười một ký tự hoặc ký hiệu đặc biệt để tinh chỉnh tìm kiếm. Biểu thức chính quy là một chuỗi ký tự bao gồm các ký tự đặc biệt để cho phép khớp mẫu trong các tiện ích như nắm chặt , tôi đã đếnquyến rũ . Lưu ý rằng các chuỗi có thể cần được đặt trong dấu ngoặc kép.

Các ký tự đặc biệt có sẵn bao gồm:

^ Bắt đầu một dòng
$ Cuối dòng
. Bất kỳ ký tự nào (ngoại trừ n dòng mới)
* 0 hoặc nhiều biểu thức trước đó
Đặt trước một biểu tượng làm cho nó trở thành một ký tự chữ

Lưu ý rằng dấu *, có thể được sử dụng ở dòng lệnh để khớp với bất kỳ số ký tự nào, bao gồm cả ký tự không, là không phải được sử dụng theo cách tương tự ở đây.

Cũng cần lưu ý việc sử dụng dấu ngoặc kép trong các ví dụ sau.

Các ví dụ

Để tìm tất cả các dòng bắt đầu bằng văn bản bằng ký tự ^:

$nắm chặt‘^ Xyz’ myfile

Để tìm tất cả các dòng kết thúc bằng văn bản bằng cách sử dụng ký tự $:

$nắm chặt‘Xyz $’ myfile

Để tìm các dòng chứa một chuỗi sử dụng cả ký tự ^ và $:

$nắm chặt‘^ Xyz $’ myfile

Để tìm các dòng bằng cách sử dụng . để khớp với bất kỳ ký tự nào:

$nắm chặt‘^ X.z’ myfile

Để tìm các dòng sử dụng dấu * để khớp với 0 hoặc nhiều hơn của biểu thức trước đó:

$nắm chặt‘^ Xy*z ’myfile

Để tìm các dòng bằng cách sử dụng. * Để khớp với 0 hoặc nhiều ký tự bất kỳ:

$nắm chặt‘^ X.*z ’myfile

Để tìm các dòng bằng cách sử dụng để thoát khỏi ký tự *:

$nắm chặt‘^ X *z ’myfile

Để tìm ký tự , hãy sử dụng:

$nắm chặt'\' tập tin của tôi

Grep biểu thức - egrep

Các nắm chặt lệnh chỉ hỗ trợ một tập hợp con của các biểu thức chính quy có sẵn. Tuy nhiên, lệnh egrep:

  • cho phép sử dụng đầy đủ tất cả các biểu thức chính quy
  • có thể đồng thời tìm kiếm nhiều hơn một biểu thức

Lưu ý rằng các biểu thức phải được đặt trong một cặp dấu ngoặc kép.

Để sử dụng màu sắc, hãy sử dụng –color hoặc tạo lại một bí danh:

$bí danh egrep='egrep --color'

Để tìm kiếm nhiều hơn một regex NS egrep lệnh có thể được viết trên nhiều dòng. Tuy nhiên, điều này cũng có thể được thực hiện bằng cách sử dụng các ký tự đặc biệt sau:

| Luân phiên, một trong hai hoặc khác
(…) Nhóm logic của một phần của biểu thức
$egrep '(^ root | ^ uucp | ^ mail)' /Vân vân/passwd

Thao tác này sẽ trích xuất các dòng bắt đầu bằng root, uucp hoặc mail từ tệp, dấu | biểu tượng có nghĩa là một trong các tùy chọn.

Lệnh sau sẽ không phải hoạt động, mặc dù không có thông báo nào được hiển thị, vì cơ bản nắm chặt lệnh không hỗ trợ tất cả các biểu thức chính quy:

$nắm chặt '(^ root | ^ uucp | ^ mail)' /Vân vân/passwd

Tuy nhiên, trên hầu hết các hệ thống Linux, lệnh grep -E cũng giống như việc sử dụng egrep :

$nắm chặt -VÀ '(^ root | ^ uucp | ^ mail)' /Vân vân/passwd

Sử dụng bộ lọc

Đường ống là quá trình gửi đầu ra của một lệnh dưới dạng đầu vào cho một lệnh khác và là một trong những công cụ Linux mạnh mẽ nhất hiện có.

Các lệnh xuất hiện trong một đường ống thường được gọi là bộ lọc vì trong nhiều trường hợp, chúng sàng lọc hoặc sửa đổi đầu vào được chuyển cho chúng trước khi gửi luồng đã sửa đổi đến đầu ra chuẩn.

Trong ví dụ sau, đầu ra tiêu chuẩn từ ls -l được chuyển làm đầu vào tiêu chuẩn cho nắm chặt chỉ huy. Đầu ra từ nắm chặt lệnh sau đó được chuyển làm đầu vào cho hơn chỉ huy.

Điều này sẽ chỉ hiển thị các thư mục trong /Vân vân :

$ls -NS /Vân vân|nắm chặt‘^ D’|hơn

Các lệnh sau là ví dụ về việc sử dụng bộ lọc:

$ps -ef|nắm chặtcron

$ai|nắm chặtkdm

Tệp mẫu

Để làm thử bài tập ôn tập, trước tiên hãy tạo tệp mẫu sau.

Sử dụng trình chỉnh sửa như nano hoặc vim để sao chép văn bản bên dưới vào một tệp có tên Mọi người:

Cá nhân J.Smith 25000
Cá nhân E.Smith 25400
Đào tạo A.Brown 27500
Đào tạo C.Browen 23400
(Quản trị) R.Bron 30500
Goodsout T.Smyth 30000
Cá nhân F.Jones 25000
đào tạo * C.Evans 25500
Goodsout W.Pope 30400
Tầng trệt T.Smythe 30500
Nhân viên J.Maler 33000

Bài tập II

  1. Hiển thị tệp Mọi người và kiểm tra nội dung của nó.
  2. Tìm tất cả các dòng chứa chuỗi thợ rèn trong tệp people. Gợi ý: sử dụng lệnh grep nhưng hãy nhớ rằng theo mặc định, nó phân biệt chữ hoa chữ thường.
  3. Tạo một tệp mới, npeople, chứa tất cả các dòng bắt đầu bằng chuỗi Cá nhân trong tệp people. Gợi ý: sử dụng lệnh grep với>.
  4. Xác nhận nội dung của npeople tệp bằng cách liệt kê tệp.
  5. Bây giờ nối tất cả các dòng mà văn bản kết thúc bằng chuỗi 500 trong tệp people vào tệp npeople. Gợi ý: sử dụng lệnh grep với >>.
  6. Một lần nữa, xác nhận nội dung của npeople tệp bằng cách liệt kê tệp.
  7. Tìm Địa chỉ IP của máy chủ được lưu trữ trong tệp / etc / hosts Gợi ý: sử dụng lệnh grep với $ (tên máy chủ)
  8. Sử dụng egrep trích xuất từ / etc / passwd tập tin các dòng tài khoản có chứa lp hoặc của riêng bạn tên người dùng .

Lời giải bài tập có thể được tìm thấy ở cuối bài viết này.

Biểu thức chính quy hơn

Một biểu thức chính quy có thể được coi là ký tự đại diện trên steroid.

Có mười một ký tự có ý nghĩa đặc biệt: dấu ngoặc vuông mở và đóng [], dấu gạch chéo ngược , dấu mũ ^, dấu đô la $, dấu chấm hoặc dấu chấm., Dấu thanh đứng hoặc ký hiệu ống |, dấu chấm hỏi?, Dấu dấu hoa thị hoặc dấu sao *, dấu cộng + và dấu ngoặc tròn mở và đóng {}. Những ký tự đặc biệt này cũng thường được gọi là siêu ký tự.

Đây là bộ ký tự đặc biệt đầy đủ:

^ Bắt đầu một dòng
$ Cuối dòng
. Bất kỳ ký tự nào (ngoại trừ n dòng mới)
* 0 hoặc nhiều biểu thức trước đó
| Luân phiên, một trong hai hoặc khác
[…] Tập hợp các ký tự rõ ràng để đối sánh
+ 1 hoặc nhiều biểu thức trước đó
? 0 hoặc 1 của biểu thức trước đó
Đặt trước một biểu tượng làm cho nó trở thành một ký tự chữ
{…} Ký hiệu định lượng rõ ràng
(…) Nhóm logic của một phần của biểu thức

Phiên bản mặc định của nắm chặt chỉ có hỗ trợ biểu thức chính quy hạn chế. Để tất cả các ví dụ sau hoạt động, hãy sử dụng egrep thay vào đó hoặc grep -E .

Để tìm các dòng bằng cách sử dụng | để khớp với một trong hai biểu thức:

$egrep‘Xxz|xzz ’myfile

Để tìm dòng bằng cách sử dụng | để khớp một trong hai biểu thức trong một chuỗi cũng sử dụng ():

$egrep‘^ X(Yz|yz)' tập tin của tôi

Để tìm các dòng bằng cách sử dụng [] để khớp với bất kỳ ký tự nào:

$egrep‘^ X[Yy]z ’myfile

Để tìm các dòng bằng cách sử dụng [] để KHÔNG khớp với bất kỳ ký tự nào:

$egrep‘^ X[^ Yy]z ’myfile

Để tìm các dòng sử dụng dấu * để khớp với 0 hoặc nhiều hơn của biểu thức trước đó:

$egrep‘^ Xy*z ’myfile

Để tìm các dòng sử dụng dấu + để khớp với 1 hoặc nhiều biểu thức trước đó:

$egrep‘^ Xy + z’ myfile

Để tìm các dòng bằng cách sử dụng? để khớp với 0 hoặc 1 của biểu thức trước đó:

$egrep‘^ Xy? Z’ myfile

Bài tập III

  1. Tìm tất cả các dòng có chứa tên Evans hoặc họa sĩ trong hồ sơ mọi người.
  2. Tìm tất cả các dòng có chứa tên Smith, Smyth hoặc Smythe trong hồ sơ mọi người.
  3. Tìm tất cả các dòng có chứa tên Brown, Browen hoặc Nguồn trong tệp mọi người.Nếu bạn có thời gian:
  4. Tìm dòng chứa chuỗi (quản trị viên), bao gồm các dấu ngoặc, trong tệp mọi người.
  5. Tìm dòng chứa ký tự * trong tệp mọi người.
  6. Kết hợp 5 và 6 ở trên để tìm cả hai biểu thức.

Các ví dụ khác

Để tìm các dòng bằng cách sử dụng . và * để khớp với bất kỳ bộ ký tự nào:

$egrep‘^ Xy.*z ’myfile

Để tìm các dòng bằng cách sử dụng {} để khớp với N số ký tự:

$egrep‘^ Xy{3}z ’myfile
$egrep‘^ Xy{4}z ’myfile

Để tìm các dòng bằng cách sử dụng {} để so khớp N hoặc nhiều lần:

$egrep‘^ Xy{3,}z ’myfile

Để tìm các dòng bằng cách sử dụng {} để so khớp N lần nhưng không quá M lần:

$egrep‘^ Xy{2,3}z ’myfile

Phần kết luận

Trong hướng dẫn này, lần đầu tiên chúng tôi xem xét việc sử dụng nắm chặt ở dạng đơn giản để tìm văn bản trong một tệp hoặc trong nhiều tệp. Sau đó, chúng tôi kết hợp văn bản cần tìm kiếm với các cụm từ thông dụng đơn giản và sau đó là các cụm từ phức tạp hơn bằng cách sử dụng egrep .

Bước tiếp theo

Tôi hy vọng bạn sẽ sử dụng tốt những kiến ​​thức thu được ở đây. Chơi thử nắm chặt các lệnh trên dữ liệu của riêng bạn và hãy nhớ rằng, các biểu thức chính quy như được mô tả ở đây có thể được sử dụng ở cùng một dạng trong chúng tôi , quyến rũawk !

Giải pháp bài tập

Bài tập I

Đầu tiên hãy đếm xem có bao nhiêu dòng trong tệp / etc / passwd .
$ wc -l /etc/passwd
Bây giờ tìm tất cả các lần xuất hiện của văn bản ở đâu trong tệp / etc / passwd.
$ grep var /etc/passwd
Tìm bao nhiêu dòng trong tệp chứa văn bản ở đâu

nắm chặt -NSở đâu/Vân vân/passwd

Tìm bao nhiêu dòng KHÔNG chứa văn bản ở đâu .

nắm chặt -cvở đâu/Vân vân/passwd

Tìm mục nhập để đăng nhập của bạn trong / etc / passwd tập tin
grep kdm /etc/passwd

Bài tập II

Hiển thị tệp Mọi người và kiểm tra nội dung của nó.
$ cat people
Tìm tất cả các dòng chứa chuỗi thợ rèn Trong tập tin Mọi người .
$ grep 'Smith' people
Tạo một tệp mới, npe people , chứa tất cả các dòng bắt đầu bằng chuỗi Cá nhân bên trong Mọi người tập tin
$ grep '^Personal' people> npeople
Xác nhận nội dung của tệp npe people bằng cách liệt kê tệp.
$ cat npeople
Bây giờ nối tất cả các dòng mà văn bản kết thúc bằng chuỗi 500 Trong tập tin Mọi người vào tập tin npe people .
$ grep '500$' people>>npeople
Một lần nữa, xác nhận nội dung của tệp npe people bằng cách liệt kê tệp.
$ cat npeople
Tìm Địa chỉ IP của máy chủ được lưu trữ trong tệp / etc / hosts .
$ grep $(hostname) /etc/hosts
Sử dụng egrep trích xuất từ / etc / passwd tập tin các dòng tài khoản có chứa lp hoặc id người dùng của riêng bạn.
$ egrep '(lp|kdm:)' /etc/passwd

Bài tập III

Tìm tất cả các dòng có chứa tên Evans hoặc họa sĩ Trong tập tin Mọi người .
$ egrep 'Evans|Maler' people
Tìm tất cả các dòng có chứa tên thợ rèn , Smyth hoặc Smythe Trong tập tin Mọi người .
$ egrep 'Sm(i|y)the?' people
Tìm tất cả các dòng có chứa tên màu nâu , Browen hoặc Nguồn trong hồ sơ mọi người.
$ egrep 'Brow?e?n' people
Tìm dòng chứa chuỗi (quản trị viên), bao gồm các dấu ngoặc, trong tệp Mọi người .

$egrep '(Quản trị viên)'Mọi người

Tìm dòng chứa ký tự * trong hồ sơ mọi người.
$ egrep '*' people
Kết hợp 5 và 6 ở trên để tìm cả hai biểu thức.

$egrep ' (Quản trị ) | *'Mọi người