Lập trình shell

Tìm kiếm với grep

Nguyễn Hải Châu (nhchau@gmail.com)
Trường Đại học Công nghệ, ĐHQGHN

grep là gì?

  • grep = Global Regular Expression Print
  • Có ba ứng dụng cùng họ grep: grep, egrepfgrep
  • grep là ứng dụng tìm kiếm text: Tìm mẫu trong file text và in ra các dòng chứa mẫu đó
  • Ca sử dụng phổ biến:
    • grep pattern file hoặc command | grep pattern: Tìm các dòng trong file hoặc trong output của command chứa pattern
    • grep -v pattern file hoặc command | grep -v pattern: Tìm các dòng trong file hoặc trong output của command không chứa pattern
    • grep -i pattern file hoặc command | grep -i pattern: Tìm mẫu không phân biệt chữ hoa/thường
  • Có thể sử dụng ký tự đại diện (wildcard) hoặc biểu thức chính qui trong mẫu tìm kiếm pattern

Tìm kiếm thông thường với grep

cat g1.txt
## big
## bground
## bad bug 
## bag
## bigger
## boogy
## sdfsdf
grep big g1.txt
## big
## bigger

Tìm kiếm thông thường với grep

cat g1.txt
## big
## bground
## bad bug 
## bag
## bigger
## boogy
## sdfsdf
grep -v big g1.txt
## bground
## bad bug 
## bag
## boogy
## sdfsdf

Sử dụng wildcard với grep

grep b.g g1.txt
## big
## bad bug 
## bag
## bigger
grep -v b.g g1.txt
## bground
## boogy
## sdfsdf

Sử dụng wildcard với grep

grep b*g g1.txt
## big
## bground
## bad bug 
## bag
## bigger
## boogy
grep -v b*g g1.txt
## sdfsdf

Sử dụng grep với biểu thức chính qui

grep ^b g1.txt
## big
## bground
## bad bug 
## bag
## bigger
## boogy
grep g$ g1.txt
## big
## bag

egrepfgrep

  • grep không hỗ trợ +? trong biểu thức chính qui. egrep (extended grep) hỗ trợ các toán tử này -
  • egrep tương đương với grep -E
  • fgrep (fast grep) có tốc độ thực thi nhanh hơn các ứng dụng grepegrep vì không hỗ trợ biểu thức chính qui
  • fgrep tương đương với grep -F

Một số pattern hữu ích của grep

  • grep 'text', grep '^text', grep 'text$': Tìm text, text ở đầu dòng và text ở cuối dòng.
  • grep '[0-9]', grep '[a-z]', grep '[A-Z]': Tìm dòng chứa số, chữ thường, chữ hoa
  • grep '[aeiouAEIOU]': Tìm các dòng có nguyên âm
  • grep '[^aeiouAEIOU]': Tìm các dòng không chứa nguyên âm

Thực hành grep

  • 4.1. Hãy liệt kê tên các thư mục con của một thư mục bất kỳ
  • 4.2. Hãy liệt kê các tiến trình "daemon" đang hoạt động trong hệ thống (các tiến trình có tên kết thúc bằng chữ d)
  • 4.3. Hãy liệt kê các dòng chứa số điện thoại của MobiFone trong tel.csv
  • 4.4. Hãy tính tổng dung lượng lưu trữ và dung lượng rỗi của các file system có định dạng ext3 hoặc ext4
  • 4.5. Sử dụng các ứng dụng ls, grep, cut để viết script liệt kê các symbolic link bị lỗi trong một thư mục. Để thử nghiệm, hãy tạo một số symbolic link lỗi bằng lệnh sau:

ln -s /tmp/sdfasd slink1

trong đó /tmp/sdfasd là một file không tồn tại.