Những Thói Quen tốt Khi Sử Dung Linux
Monday, August 13, 2007 2:07:11 AM
Chắc các bạn cũng đã từng nghe nói: Để làm chủ và thấy được cái hay, cái đẹp, cái mạnh của Linux thì phải sử dụng chế độ dòng lệnh thật “pro”. Vậy thế nào là “pro”? Những thói quen tôi kể ra dưới đây làm tôi thấy “pro” hơn, bạn hãy thử xem. Không khó hiểu đâu, tin tôi đi, vì cũng như bạn, tôi chưa biết những “pro” làm gì, nhưng tôi biết những người chưa “pro” làm như thế nào. Hãy tập những thủ thuật này thành những thói quen tốt khi dùng dòng lệnh luôn nhé.
1. Tạo cây thư mục bằng một lệnh
Để tạo thư mục /home/a/b/c, tôi hay dùng:
~ $ cd /home
~/home $ mkdir a
~/home $ cd a
~/home/a $ mkdir b
~/home/a $ cd b
~/home/a/b/ $ mkdir c
Tốn thời gian và công sức. Hãy thay bằng chỉ một lệnh mkdir với tham số -p
~$ mkdir -p /home/a/b/c
OK, còn một lệnh sau đây sẽ tiết kiệm cho bạn bao nhiêu dòng lệnh tạo thư mục? Hãy thử xem nhé
~ $ mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}
2. Đổi đường dẫn khi giải nén
Đừng di chuyển file đến thư mục cần rồi mới giải nén,
~$ cp newarc.tar.gz tmp/a/b/c
~$ cd tmp/a/b/c
~$ tar xvf newarc.tar.gz
hãy giải nén nó đến thư mục cần
~ $ tar xvf newarc.tar.gz -C /a/b/c
3. Kết hợp các lệnh bằng các toán tử điều khiển
&&: nếu lệnh 1 thực hiện thành công thì làm lệnh 2. Lệnh 1 fail thì không làm lệnh 2
~ $ cd tmp/a/b/c && tar xvf ~/archive.tar
||: nếu lệnh 1 thành công thì không làm lệnh 2. Lệnh 1 fail thì làm lệnh 2
~ $ cd tmp/a/b/c || mkdir -p tmp/a/b/c
Kếthợp hai toán tử trên:
~ $ cd tmp/a/b/c || mkdir -p tmp/a/b/c && tar xvf -C tmp/a/b/c ~/archive.tar
4. Cẩn thận với các biến và dấu trích dẫn
Hãy xem các trường hợp sau:
~ $ ls tmp/
a b
~ $ VAR=”tmp/*”
~ $ echo $VAR
tmp/a tmp/b
~ $ echo “$VAR”
tmp/*
~ $ echo $VARa
~ $ echo “$VARa”
~ $ echo “${VAR}a”
tmp/*a
~ $ echo ${VAR}a
tmp/a
Nếu bạn muốn xuất ra chuỗi “tmp/*a” thì hãy sử dụng các dấu ngoặc cho hợp lý.
5. Dùng dấu back slash để quản lý dòng lệnh dài
~ $ cd tmp/a/b/c || \
> mkdir -p tmp/a/b/c && \
> tar xvf -C tmp/a/b/c ~/archive.tar
hoặc đẹp hơn:
~ $ cd tmp/a/b/c \
> || \
> mkdir -p tmp/a/b/c \
> && \
> tar xvf -C tmp/a/b/c ~/archive.tar
(còn tiếp)
Đông Thao
----------------------------------------------------------------------------------------------------------
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
---------------------------------------------------------------------------------------------------------
Cảm ơn bạn Đông Thao rất nhiều










