Những thói quen tốt với Linux command line(tt)

Now, continue …

6. Sử dụng xargs làm bộ lọc

Nếu bạn chưa biết xargs là gì, hãy gõ ngay lập tức “man xargs”, đó cũng là điều tôi nhắc khi bạn cảm thấy lạ với bất cứ lệnh nào trong bài viết này. Hãy xem trang man giới thiệu thế nào

xargs – build and execute command lines from standard input

Xargs có thể được dùng kết hợp với những chương trình tìm kiếm khác như find. Lợi ích của sự kết hợp này là sử dụng các kết quả tìm kiếm như là input của những thao tác tiếp theo sau. Ví dụ cách sử dụng truyển thống theo kiểu này:

~ $ find some-file-criteria some-file-path |
> xargs some-great-command-that-needs-filename-arguments

Tuy nhiên cách sử dụng “cổ điển” kết hợp với “find”, đó chỉ là một công dụng của công cụ tiện ích này. Khi muốn sử dụng xargs như một thói quen thì bạn sẽ thấy rất thú vị với ví dụ sau:

~/tmp $ ls -1 | xargs
December_Report.pdf README a archive.tar mkdirhier.sh
~/tmp $ ls -1 | xargs file
December_Report.pdf: PDF document, version 1.3
README: ASCII text
a: directory
archive.tar: POSIX tar archive
mkdirhier.sh: Bourne shell script text executable
~/tmp $

Thật tuyệt, rất đơn giản và thú vị!

Ngoài cách sử dụng khi truyền tên file, hãy dùng xargs bất cứ khi nào bạn muốn nối các dòng text nằm trên các hàng khác nhau thành 1 hàng duy nhất. Xem ví dụ sau:

~/tmp $ ls -l | xargs
-rw-r–r– 7 joe joe 12043 Jan 27 20:36 December_Report.pdf -rw-r–r– 1
root root 238 Dec 03 08:19 README drwxr-xr-x 38 joe joe 354082 Nov 02
16:07 a -rw-r–r– 3 joe joe 5096 Dec 14 14:26 archive.tar -rwxr-xr-x 1
joe joe 3239 Sep 30 12:40 mkdirhier.sh
~/tmp $

7. Grep

Ai cũng biết công dụng của grep là để tìm những dòng text có chứa một cụm từ nào đó từ dữ liệu input. Ví dụ:

~/tmp $ grep a file.txt

liệt kê tất cả những dòng nào trong file file.txt có chứa chữ “a”.

Để đếm số dòng output, có thể bạn sẽ quen với cách đưa kết quả qua đường ống (pipeline) đến trình wc (dùng man!), một chương trình đếm byte, word, line thông dụng. Hãy thử thay thói quen đó bằng sử dụng tham số -c của grep xem, lợi ích đầu tiên là về mặt thời gian

~ $ time grep word tmp/a/longfile.txt | wc -l
2811

real 0m0.097s
user 0m0.006s
sys 0m0.032s
~ $ time grep -c word tmp/a/longfile.txt
2811

real 0m0.013s
user 0m0.006s
sys 0m0.005s
~ $

Ngoài lợi ích về mặt thời gian, khi bạn đếm trong nhiều file, tham số -c sẽ cho kết quả riêng biệt với từng file trong khi wc sẽ cho kết quả tổng cộng của các file.

Tuy nhiên bạn sẽ lưu ý một điểm là nếu như trong một dòng của file xuất hiện nhiều lần từ “word” thì kết quả của hai cách trên sẽ như thế nào? Lúc này tham số -c sẽ xem dòng chưa 1 từ word với dòng chứa 5 từ word là như nhau, vì nó đếm số dòng. Nếu bạn muốn trả về số lần xuất hiện của từ đó trong file, hãy dùng wc với tham số -o của grep.

~ $ grep -o and tmp/a/longfile.txt | wc -l
3402
~ $

Một điều nữa là trong trường hợp lọc ls với một thuộc tính nhất định, ví dụ ta muốn liệt kê ra những thư mục nào có độ sâu (depth) là 4 thì grep không áp dụng được mà ta dùng một công cụ khác là awk:

~/tmp $ ls -l | awk ‘$2 == “4”‘
-rw-r–r– 4 abel abel 5096 May 14 14:26 archive.tar
-rw-r–r– 4 root root 238 Dec 03 08:19 README
~/tmp $

Một thói quen không nên nữa khi sử dụng grep là dùng để tìm kiếm nội dung file được đọc bằng lệnh cat. Thói quen này rất thường gặp nhưng nó làm phức tạp vấn đề và lãng phí về thời gian bởi vì bản thân grep đã nhận tên file làm dữ liệu đầu vào. Hãy xem ví dụ sau:

~ $ time cat tmp/a/longfile.txt | grep and
2811

real 0m0.015s
user 0m0.003s
sys 0m0.013s
~ $ time grep and tmp/a/longfile.txt
2811

real 0m0.010s
user 0m0.006s
sys 0m0.004s
~ $

Đông Thao

About dongthao

The best things in life, they are free ... (Cry on my shoulder lyric)
This entry was posted in Linux, Linux Tutorial. Bookmark the permalink.

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s