NỘI DUNG
Tiếp theo nội dung Phần 4: Ép xung tốc độ thao tác Command Line với Bash và nhập môn Bash Script, kỳ này tôi sẽ chuyển sang một nội dung quan trọng khác mà bạn thường xuyên phải làm, đó là tìm kiếm thông tin trong hệ thống. Thực tế vấn đề này có thể được xử lý bằng nhiều cách, nhưng trong nội dung này tôi sẽ sử dụng command grep để demo. Ngoài ra, tôi cũng đề cập sơ bộ về vấn đề liên quan như redirect, piping cũng như một số giải pháp nâng cao hơn khi cần tìm kiếm và xử lý.
#1 Redirect và piping
Thực tế khi sử dụng grep, bạn sẽ thấy nó hay được “ăn kèm” với piping. Và trong một diễn biến khác, thằng piping lại có dây mơ rễ má với redirect nên tôi gom lại nói luôn chỗ này cho gọn để về sau bạn khỏi phải lăn tăn khi đụng mặt 2 thằng này.
#1.1 Redirect
Thông thường, bạn có thể gặp 3 tình huống sử dụng phổ biến với redirect như sau:
- Redirect để tạo file mới với command ví dụ như:
echo ‘test’ > redirect_new.txt
- Redirect vô file hiện hữu với command ví dụ như:
echo ‘test again’ >> redirect_new.txt
- Redirect từ file với command ví dụ như:
wc -w < redirect_new.txt
Lưu ý: wc -w sẽ đếm số từ đọc được từ nội dung file redirect_new.txt
#1.2 Piping
Piping kí hiệu là “|”, dùng để xuất kết quả của một command ra làm input cho command khác. Ví dụ như sau:
cat redirect_new.txt | wc -w
Cũng tương tự nội dung redirect từ file, lúc này kết quả chạy command cat redirect_new.txt sẽ được “dẫn” vô làm input cho command wc -w để xuất ra kết quả như bạn thấy là con số 3.
#2 Các combo bẩn bựa với grep
#2.1 Grep là cái gì?
grep có khả năng dò tìm pattern hay regular expression trong output của các command khác (ví dụ ls với piping) và nội dung của text file để xuất kết quả tìm kiếm khớp ra standard output (thường là terminal screen).
Lưu ý: Như tôi đề cập trong Giải ngố Linux – Phần 4: Quản lý process, thu thập thông tin hệ thống, log và phần cứng, Stdout và stderr tương ứng với standard output và standard error. Ngoài ra còn có thằng stdin là standard input và đây là bộ 3 nguyên tử của input/output (I/O) connection.
Về cơ bản, bạn có thể dùng grep với cú pháp:
grep [option] pattern <file…>
Nếu muốn chi tiết hơn, bạn có thể kiểm tra các option (ví dụ option -r: recursive search – tìm kiếm đệ quy, option -i: không phân biệt chữ hoa chữ thường) với command:
man grep
#2.2 Các chiêu thức tùy chỉnh kết quả tìm kiếm với grep
Giờ tôi sẽ chuyển sang một tình huống thực tế mà bạn có thể tận dụng kỹ thuật cá nhân với grep.
Như tôi có đề cập trong nội dung Giải ngố Linux – Phần 2: Linux Filesystem và các đòn cơ bản để duyệt và quản lý file với Command Line, vị trí /usr/bin sẽ chứa phần lớn các file thực thi của các chương trình. Thử kiểm tra nội dung thư mục này với command ls -la /usr/bin bạn sẽ thấy hệ thống nó phọt ra kết quả là một danh sách dài ngoằng. Nếu bây giờ giả sử bạn chỉ muốn xem có đám nào liên quan đến “zip” không thì sao?
Cách đơn giản nhất (và mỏi mắt thấy mịa) là cứ chạy command ls như trên rồi căng mắt ra mà dò (Thực tế thì người ta hay dùng command ls -la /usr/bin | less để cho phép dùng phím mũi tên di chuyển lên/ xuống trong quá trình tìm kiếm và thoát ra bằng phím “q”).
Cách thứ hai nhẹ nhàng tinh tế hơn là dùng combo:
ls -la /usr/bin | grep zip
Bạn thấy đấy, giờ kết quả “thân thiện” hơn nhiều so với không dùng grep. Ở đây bạn có thể sử dụng một số option phổ biến để tùy chỉnh kết quả:
- -n: Hiển thị số dòng của dòng kết quả
ls -la /usr/bin | grep -n zip
- -c: Đếm số dòng khớp với pattern cần tìm
ls -la /usr/bin | grep -c zip
- -w: Tìm chính xác pattern là một từ cụ thể (như bạn thấy ở ví dụ bên dưới, cái này sẽ giúp bạn thu gọn kết quả hơn nữa)
ls -la /usr/bin | grep -w zip
- -v: Xuất kết quả tất cả các dòng không khớp với pattern (cái này mới nghe thấy dở hơi nhưng thật ra sẽ hữu ích trong một số tình huống bạn có nhiều file tên gần giống nhau và bạn xác định không quan tâm đến một pattern nhất định)
ls -l | grep -v Music
--color
: “làm màu” cho pattern cần tìm kiếm
ls -la /usr/bin | grep --color zip
#2.3 Tăng tốc kiểm tra process và cấu hình với grep
#2.3.1 Kiểm tra process
Một trong những nhu cầu hay phát sinh trong quá trình vọc vạch hệ thống đó là kiểm tra tình trạng của process (tiến trình).
Như tôi giới thiệu trong Giải ngố Linux – Phần 4: Quản lý process, thu thập thông tin hệ thống, log và phần cứng, bạn có thể kiểm tra Foreground process với command ps aux. Tuy nhiên, kết quả xuất ra có thể hơi dài nên bạn có thể tận dụng grep để tìm chính xác cái bạn mong muốn kiểu như sau (với httpd).
ps aux | grep httpd
#2.3.2 Kiểm tra cấu hình
Tiếp tục sang một ứng dụng phổ biến khác là khi bạn làm việc với các file cấu hình. Ví dụ như phần cấu hình networrk tôi đề cập trong Giải ngố Virtualization – Phần 7: Cấu hình thủ công IP Address trên Kali Linux và đả thông kinh mạch đường mạng. Tôi có thể kiểm tra nội dung cấu hình hiện tại với command:
cat /etc/network/interfaces
Với file cấu hình có sử dụng nhiều comment (bắt đầu bằng dấu #), bạn có thể phải mất thời gian di chuyển để đọc thông tin. Lúc này, bạn có thể loại bỏ đám comment để tập trung vào thông số cấu hình bằng cách sử dụng command:
grep -v "#" /etc/network/interfaces
Tương tự các phần khác, bạn cũng có thể dò tìm một pattern cụ thể trong nội dung file bằng cách sử dụng command tương tự như:
grep 130 /etc/network/interfaces
#3 Các anh em họ quyền lực của grep
Tôi nghĩ, đến đây chắc bạn đã hấp thu được phần lớn công lực của grep. Tuy nhiên, nếu nhiệm vụ của bạn được nâng cấp từ “tìm” lên “tìm và xử lý” thì có thể bạn sẽ cần đến các anh em họ của grep là sed, cut và awk.
#3.1 Sed
Sed là dạng stream editor, đại khái là bạn có thể chỉnh sửa cái text string ngay trong quá trình nó đang phọt ra luôn chứ không cần ngồi chờ. Mặc định nó cũng sẽ xuất kết quả chỉnh sửa ra standard output. Bạn có thể thử với ví dụ sau:
echo "Yeah, they had us the first half, I'm not gonna lie" | sed 's/first/second/'
Với command này, stream từ echo sẽ bị bắt lại và thay thế từ “first” bằng “second”.
#3.2 Cut
Cut được dùng để trích một phần text từ nội dung gốc và xuất ra standard output với 2 option phổ biến là:
- option -f: field number
- option -d: field delimiter
Để dễ hình dung bạn xem ví dụ sau:
echo "Yeah, they had us the first half, I'm not gonna lie" | cut -f 2 -d ","
Ở đây dòng text bị cắt ra căn cứ theo delimiter “,” thành 3 phần (vì có 2 dấu “,” trong text và sau đó field number số 2 được hiển thị ra standard output.
#3.3 Awk
Awk là ngôn ngữ lập trình được thiết kế để xử lý text hay được dùng để trích xuất dữ liệu và báo cáo. Với thằng này bạn có thể dùng option -F (field separator) kèm với print command để xuất kết quả.
Để dễ hình dung bạn xem ví dụ sau:
echo "who_the_*_are_you" | awk -F "_" '{print $1, $4, $5}'
Ở đây với 4 field separator “_” bạn sẽ có 5 item đánh số từ 1 đến 5 và phần {print $1, $4, $5} in ra 3 item 1, 4 và 5.
Thực tế 3 thằng sed, cut và awk có khả năng rất xử lý linh hoạt nên việc sử dụng cũng sẽ phức tạp hơn khá nhiều. Ở trên, tôi chỉ giới thiệu để bạn hình dung sơ bộ, nếu cần chi tiết bạn sẽ phải tra cứu thêm các nguồn tham khảo khác (hoặc comment để tôi nghiên cứu giới thiệu trong các bài khác).
9 thoughts on “Giải ngố Kali Linux – Phần 5: Nâng cấp kỹ năng tìm kiếm trên Linux với grep command”