3.2 Bài 2
Chứng chỉ: |
Linux Essentials |
---|---|
Phiên bản: |
1.6 |
Chủ đề: |
3 Sức mạnh của Dòng lệnh |
Mục tiêu: |
3.2 Tìm kiếm và Trích xuất Dữ liệu từ Tệp |
Bài: |
2 trên 2 |
Giới thiệu
Trong bài học này, chúng ta sẽ tìm hiểu về các công cụ được sử dụng để thao tác với văn bản. Những công cụ này thường được quản trị viên hệ thống hoặc chương trình sử dụng để tự động theo dõi hoặc xác định thông tin định kỳ cụ thể.
Tìm kiếm trong Tệp bằng grep
Công cụ đầu tiên mà chúng ta sẽ thảo luận trong bài học này là lệnh grep
. grep
là chữ viết tắt của cụm từ “global regular expression print” (in biểu thức chính quy toàn cầu) và chức năng chính của nó là tìm kiếm mẫu đã được chỉ định trong các tệp. Lệnh này sẽ xuất dòng chứa mẫu đã được chỉ định và đánh dấu mẫu bằng màu đỏ.
$ grep bash /etc/passwd root:x:0:0:root:/root:/bin/bash user:x:1001:1001:User,,,,:/home/user:/bin/bash
Giống như hầu hết các lệnh, grep
cũng có thể được tinh chỉnh bằng cách sử dụng các tùy chọn. Dưới đây là những tuỳ chọn phổ biến nhất:
-i
-
tìm kiếm không phân biệt chữ hoa chữ thường
-r
-
tìm kiếm là đệ quy (tìm kiếm tất cả các tệp trong thư mục đã được chỉ định và các thư mục con của nó)
-c
-
tìm kiếm đếm số kết quả khớp
-v
-
đảo ngược kết quả khớp để in các dòng không khớp với từ khoá tìm kiếm
-E
-
bật các biểu thức chính quy mở rộng (cần thiết cho một số ký tự meta nâng cao hơn như
|
,+
và?
)
grep
còn có nhiều tùy chọn hữu ích khác. Hãy tham khảo trang hướng dẫn để tìm hiểu thêm về nó.
Biểu thức Chính quy
Công cụ thứ hai là một công cụ rất mạnh mẽ. Nó được sử dụng để mô tả các bit văn bản trong tệp và còn được gọi là biểu thức chính quy. Biểu thức chính quy cực kỳ hữu ích trong việc trích xuất dữ liệu từ tệp văn bản bằng cách xây dựng các mẫu. Chúng thường được sử dụng trong các tệp lệnh hoặc khi lập trình với các ngôn ngữ cấp cao, chẳng hạn như Perl hoặc Python.
Khi làm việc với các biểu thức chính quy, điều rất quan trọng cần lưu ý là mọi ký tự đều được tính, và mẫu được viết với mục đích khớp với một chuỗi ký tự cụ thể, hay còn gọi là chuỗi. Hầu hết các mẫu sử dụng các ký tự ASCII thông thường, chẳng hạn như chữ cái, chữ số, dấu chấm câu hoặc các ký hiệu khác, nhưng nó cũng có thể sử dụng các ký tự Unicode để khớp với bất kỳ loại văn bản nào khác.
Danh sách sau đây sẽ giải thích các ký tự meta của biểu thức chính quy được sử dụng để tạo các mẫu.
.
-
So khớp với bất kỳ ký tự đơn nào (ngoại trừ ký tự xuống dòng)
[abcABC]
-
So khớp bất kỳ một ký tự nào trong dấu ngoặc
[^abcABC]
-
So khớp với bất kỳ ký tự nào ngoại trừ ký tự trong ngoặc
[a-z]
-
So khớp với bất kỳ ký tự nào trong phạm vi
[^a-z]
-
So khớp với bất kỳ ký tự nào ngoại trừ các ký tự trong phạm vi
sun|moon
-
Tìm một trong các chuỗi được liệt kê
^
-
Bắt đầu một dòng
$
-
Kết thúc dòng
Tất cả các chức năng của biểu thức chính quy cũng có thể được triển khai thông qua grep
. Bạn có thể thấy rằng trong ví dụ trên, từ này không được bao quanh bởi dấu trích dẫn kép. Để ngăn vỏ diễn giải siêu ký tự, ta nên sử dụng một mẫu phức tạp hơn ở giữa dấu trích dẫn kép (" "). Với mục đích thực hành, chúng ta sẽ sử dụng dấu trích dẫn kép khi triển khai các biểu thức chính quy. Các dấu trích dẫn kép khác sẽ giữ nguyên chức năng thông thường của chúng như đã được thảo luận trong các bài học trước.
Các ví dụ sau đây sẽ nhấn mạnh chức năng của các biểu thức chính quy. Chúng ta sẽ cần dữ liệu trong tệp; do đó, nhóm lệnh tiếp theo sẽ chỉ nối các chuỗi khác nhau vào tệp text.txt
.
$ echo "aaabbb1" > text.txt $ echo "abab2" >> text.txt $ echo "noone2" >> text.txt $ echo "class1" >> text.txt $ echo "alien2" >> text.txt $ cat text.txt aaabbb1 abab2 noone2 class1 alien2
Ví dụ đầu tiên là sự kết hợp tìm kiếm thông qua tệp có và không có biểu thức chính quy. Để hiểu rõ về các biểu thức chính quy, điều quan trọng là chỉ ra sự khác biệt. Lệnh đầu tiên tìm kiếm chính xác chuỗi ở bất kỳ vị trí nào trong dòng, trong khi lệnh thứ hai lại tìm kiếm các bộ ký tự chứa bất kỳ ký tự nào nằm giữa các dấu trích dẫn. Do đó, kết quả của các lệnh sẽ khác nhau.
$ grep "ab" text.txt aaabbb1 abab2 $ grep "[ab]" text.txt aaabbb1 abab2 class1 alien2
Nhóm ví dụ thứ hai cho thấy ứng dụng của ký tự meta ở đầu và cuối dòng. Điều quan trọng là cần phải đặt 2 ký tự ở đúng vị trí trong biểu thức. Khi chỉ định đầu dòng, siêu ký tự cần phải đứng trước biểu thức; khi chỉ định cuối dòng, siêu ký tự cần phải đứng sau biểu thức.
$ grep "^a" text.txt aaabbb1 abab2 alien2 $ grep "2$" text.txt abab2 noone2 alien2
Ngoài các ký tự meta được giải thích trước đó, các biểu thức chính quy cũng có các ký tự meta cho phép nhân mẫu đã chỉ định trước đó:
*
-
Không hoặc nhiều mẫu trước đó
+
-
Một hoặc nhiều mẫu trước đó
?
-
Không hoặc một trong các mẫu trước đó
Đối với các ký tự meta cấp số nhân, lệnh bên dưới sẽ tìm kiếm một chuỗi chứa ab
, một ký tự đơn và một hoặc nhiều ký tự đã tìm thấy trước đó. Kết quả cho thấy grep
đã tìm thấy chuỗi aaabbb1
khớp với phần abbb
cũng như abab2
. Vì ký tự +
là ký tự biểu thức chính quy mở rộng nên chúng ta cần chuyển tùy chọn -E
cho lệnh grep
.
$ grep -E "ab.+" text.txt aaabbb1 abab2
Hầu hết các ký tự meta đều khá dễ hiểu; nhưng trong những lần sử dụng đầu tiên thì chúng lại có thể trở nên khá phức tạp. Các ví dụ ở trên đại diện cho một phần nhỏ chức năng của biểu thức chính quy. Hãy thử tất cả các siêu ký tự từ bảng trên để hiểu thêm về cách chúng hoạt động.
Bài tập Hướng dẫn
Sử dụng grep
và tệp /usr/share/hunspell/en_US.dic
, hãy tìm các dòng phù hợp với các tiêu chí sau:
-
Tất cả các dòng chứa từ
cat
ở bất kỳ vị trí nào trên dòng. -
Tất cả các dòng không chứa bất kỳ ký tự nào sau đây:
sawgtfixk
. -
Tất cả các dòng bắt đầu bằng 3 chữ cái bất kỳ và từ
dig
. -
Tất cả các dòng kết thúc bằng ít nhất một chữ`e`.
-
Tất cả các dòng chứa một trong các từ sau:
org
,kay
hoặctuna
. -
Số dòng bắt đầu bằng một hoặc không chữ
c
, theo sau là chuỗiati
.
Bài tập Mở rộng
-
Hãy tìm biểu thức chính quy khớp với các từ trong dòng “Bao gồm” và không khớp với các từ trong dòng “Loại trừ”:
-
Bao gồm:
pot
,spot
,apot
Loại trừ:
potic
,spots
,potatoe
-
Bao gồm:
arp99
,apple
,zipper
Loại trừ:
zoo
,arive
,attack
-
Bao gồm:
arcane
,capper
,zoology
Loại trừ:
air
,coper
,zoloc
-
Bao gồm:
0th/pt
,3th/tc
,9th/pt
Loại trừ:
0/nm
,3/nm
,9/nm
-
Bao gồm:
Hawaii
,Dario
,Ramiro
Loại trừ:
hawaii
,Ian
,Alice
-
-
Có những lệnh nào khác hữu ích thường được sử dụng để tìm kiếm trong các tệp không? Nó có những chức năng bổ sung nào?
-
Hãy nhớ lại bài học trước và sử dụng một trong các ví dụ để thử tìm kiếm một mẫu cụ thể trong đầu ra của lệnh với sự trợ giúp của
grep
.
Tóm tắt
Trong bài học này, bạn đã học về:
-
Biểu thức chính quy siêu ký tự
-
Cách tạo mẫu với biểu thức chính quy
-
Cách tìm kiếm trong các tệp
Các lệnh được dùng trong bài tập:
grep
-
Tìm kiếm các ký tự hoặc chuỗi trong một tệp
Đáp án Bài tập Hướng dẫn
Sử dụng grep
và tệp /usr/share/hunspell/en_US.dic
, hãy tìm các dòng phù hợp với các tiêu chí sau:
-
Tất cả các dòng chứa từ
cat
ở bất kỳ vị trí nào trên dòng.$ grep "cat" /usr/share/hunspell/en_US.dic Alcatraz/M Decatur/M Hecate/M ...
-
Tất cả các dòng không chứa bất kỳ ký tự nào sau đây:
sawgtfixk
.$ grep -v "[sawgtfixk]" /usr/share/hunspell/en_US.dic 49269 0/nm 1/n1 2/nm 2nd/p 3/nm 3rd/p 4/nm 5/nm 6/nm 7/nm 8/nm ...
-
Tất cả các dòng bắt đầu bằng 3 chữ cái bất kỳ và từ
dig
.$ grep "^...dig" /usr/share/hunspell/en_US.dic cardigan/SM condign predigest/GDS ...
-
Tất cả các dòng kết thúc bằng ít nhất một chữ`e`.
$ grep -E "e+$" /usr/share/hunspell/en_US.dic Anglicize Anglophobe Anthropocene ...
-
Tất cả các dòng chứa một trong các từ sau:
org
,kay
hoặctuna
.$ grep -E "org|kay|tuna" /usr/share/hunspell/en_US.dic Borg/SM George/MS Tokay/M fortunate/UY ...
-
Số dòng bắt đầu bằng một hoặc không chữ
c
, theo sau là chuỗiati
.$ grep -cE "^c?ati" /usr/share/hunspell/en_US.dic 3
Đáp án Bài tập Mở rộng
-
Hãy tìm biểu thức chính quy khớp với các từ trong dòng “Bao gồm” và không khớp với các từ trong dòng “Loại trừ”:
-
Bao gồm:
pot
,spot
,apot
Loại trừ:
potic
,spots
,potatoe
+ Đáp án:
pot$
-
Bao gồm:
arp99
,apple
,zipper
Loại trừ:
zoo
,arive
,attack
Đáp án:
p+
-
Bao gồm:
arcane
,capper
,zoology
Loại trừ:
air
,coper
,zoloc
Đáp án:
arc|cap|zoo
-
Bao gồm:
0th/pt
,3th/tc
,9th/pt
Loại trừ:
0/nm
,3/nm
,9/nm
Đáp án:
[0-9]th.+
-
Bao gồm:
Hawaii
,Dario
,Ramiro
Loại trừ:
hawaii
,Ian
,Alice
Đáp án:
^[A-Z]a.*i+
-
-
Có những lệnh nào khác hữu ích thường được sử dụng để tìm kiếm trong các tệp không? Nó có những chức năng bổ sung nào?
Lệnh
sed
. Lệnh này có thể tìm và thay thế các ký tự hoặc bộ ký tự trong một tệp. -
Hãy nhớ lại bài học trước và sử dụng một trong các ví dụ để thử tìm kiếm một mẫu cụ thể trong đầu ra của lệnh với sự trợ giúp của
grep
.Lấy một trong các câu trả lời từ Bài tập Mở rộng và tìm dòng có thể đọc, viết và thực thi dưới dạng quyền nhóm. Câu trả lời của bạn có thể khác, tùy thuộc vào lệnh bạn đã chọn và mẫu bạn đã tạo.
$ cat contents.txt | tr -s " " | grep "^....rwx"
Bài tập này nhằm cho bạn thấy rằng
grep
cũng có thể nhận đầu vào từ các lệnh khác nhau và nó có thể giúp lọc thông tin được tạo.