Khi quản trị Linux, đôi khi chúng ta cần phải thu thập các khối dữ liệu hoặc thống kê file cho mục đích xử lý hoặc phân tích. Bài viết này sẽ giới thiệu một số lệnh thao tác với tệp văn bản trong Linux.
Bài hôm trước chúng ta đã tìm hiểu về một số trình soạn thảo văn bản trong Linux, nếu các bạn chưa đọc thì có thể xem tại Bài 3: Nano, emacs và vim: Trình soạn thảo trong Linux.
Xem nội dung file trên cửa sổ lệnh
Lệnh cat
dùng để in giá trị của file ra cửa sổ dòng lệnh. Lệnh này thường được sử dụng đối với các file text có kích thước nhỏ.
$ cat numbers.txt
42
2A
52
0010 1010
*
Lệnh cat
có thể in ra nội dung của nhiều file, và chúng được nối với nhau.
$ cat file1.txt file2.txt
Các tùy chọn hiển thị:
-A (--show-all)
: hiển thị tất cả – tương đương với option-vET
.-E (--show-ends)
: hiển thị ký tự $ khi kết thúc.-n (--number)
: đánh số tất cả các dòng và hiển thị dòng được chỉ định.-s (--squeeze-blank)
: không hiển thị các file văn bản trống lặp đi lặp lại.-T (--show-tabs)
: hiển thị ký tự tab-v (--show-non-printing)
: hiển thị các ký tự non-printing
Nếu muốn hiển thị nội dung 2 file cạnh nhau và không quan tâm đến độ “thẩm mĩ” của kết quả thì có thể sử dụng lệnh paste
. Ví dụ:
$ cat random.txt
42
Flat Land
Schrodinger's Cat
0010 1010
0000 0010
$
$ cat numbers.txt
42
2A
52
0010 1010
*
$
$ paste random.txt numbers.txt
42 42
Flat Land 2A
Schrodinger's Cat 52
0010 1010 0010 1010
0000 0010 *
Lệnh chuyển đổi file – Thao tác với tệp văn bản trong Linux
Lệnh od
Lệnh od
được dùng để hiển thị file dưới dạng bát phân. Cột đầu tiên trong kết quả thể hiện số thứ tự của dòng.
$ cat fourtytwo.txt
42
fourty two
quarante deux
zweiundvierzig
forti to
$ od fourtytwo.txt
0000000 031064 063012 072557 072162 020171 073564 005157 072561
0000020 071141 067141 062564 062040 072545 005170 073572 064545
0000040 067165 073144 062551 075162 063551 063012 071157 064564
0000060 072040 005157
0000064
Để hiển thị cả giá trị gốc lẫn giá trị bát phân, sử dụng thêm option -cb
.
$ od -cb fourtytwo.txt
000000 4 2 \n f o u r t y t w o \n q u
064 062 012 146 157 165 162 164 171 040 164 167 157 012 161 165
0000020 a r a n t e d e u x \n z w e i
141 162 141 156 164 145 040 144 145 165 170 012 172 167 145 151
0000040 u n d v i e r z i g \n f o r t i
165 156 144 166 151 145 162 172 151 147 012 146 157 162 164 151
0000060 t o \n
040 164 157 012
0000064
Lệnh split
Lệnh này có thể cắt một file lớn thành những mảnh nhỏ, có thể chia ra dựa vào kích thước, bytes, số dòng, … Giả sử ta cần tách một file ra nhiều file nhỏ, mỗi file nhỏ chứa 3 dòng.
Nội dung file gốc:
$ cat fourtytwo.txt
42
fourty two
quarante deux
zweiundvierzig
forti to
Sử dụng lệnh split
với option -l
để tách:
$ split -l 3 fourtytwo.txt split42
$ ls split42*
split42aa split42ab
Kiểm tra thì thấy có 2 file mới được sinh ra. Tiến hành xem nội dung từng file, ta thấy mỗi file chứa 3 dòng như yêu cầu.
$ cat split42aa
42
fourty two
quarante deux
$ cat split42ab
zweiundvierzig
forti to
$
Lệnh sort
Lệnh sort
giúp sắp xếp lại giá trị đầu ra (lưu ý, lệnh này không làm thay đổi file gốc, nó chỉ sắp xếp trên giá trị xuất ra).
Để sắp xếp theo tiêu chuẩn mặc định của hệ thống, sử dụng lệnh sort
không có option:
$ cat alphabet.txt
Alpha
Tango
Bravo
Echo
Foxtrot
$ sort alphabet.txt
Alpha
Bravo
Echo
Foxtrot
Tango
Lúc này giá trị đã được sắp xếp theo thứ tự bảng chữ cái.
Nếu cần sắp xếp kí tự số, sử dụng thêm option -n
:
$ sort counts.txt
105
37
42
54
8
$ sort -n counts.txt
8
37
42
54
105
Nếu muốn lưu giá trị đã sắp xếp ra một file mới thì chúng ta sử dụng option -o
:
$ sort -o newfile.txt counts.txt
Lệnh nl
Lệnh nl
(viết tắt của number line) dùng để đánh số thứ tự cho từng dòng trong kết quả. Ví dụ:
$ nl ContainsBlankLines.txt
1 Alpha
2 Tango
3 Bravo
4 Echo
5 Foxtrot
Còn nếu muốn đánh số tất cả các dòng kể cả dòng trống, sử dụng thêm option -ba
:
$ nl -ba ContainsBlankLines.txt
1 Alpha
2 Tango
3
4 Bravo
5 Echo
6
7
8 Foxtrot
Các lệnh xem file
Lệnh more
Như mình đã nói ở đầu bài viết thì lệnh cat có thể được dùng để xem nội dung của một file text mà không cần mở nó bằng trình soạn thảo văn bản. Tuy nhiên cat
chỉ nên dùng trong trường hợp file không quá dài. Bởi vì nếu file quá dài, lúc đọc sẽ đặt sức ép lên bộ nhớ, do đó ta cần những giải pháp hiệu quả hơn.
Với lệnh more
, chúng ta có thể đọc tuần tự nội dung các file bằng cách nhấn phím Space
hoặc phím Enter
, nội dung sẽ dần dần hiện ra.
Lệnh less
Lệnh less
cũng được dùng để mở một tệp để đọc và tương tác, cho phép lên xuống, di chuyển và tương tác.
$ less access_log
Để di chuyển trang lên xuống:
- Nhấn phím
space
để lăn xuống - Nhấn
b
để di chuyển lại trang phía trên
Di chuyển lên đầu và cuối tập tin:
- Gõ
G
để xuống cuối tập tin - Gõ
g
để lên trên đầu tập tin
Để tìm kiếm một chuỗi:
/{chuỗi}
Hoặc:
?{chuỗi}
Lưu ý: Điểm khác biệt giữa less và more là less cho phép cuộn ngược lên các trang dữ liệu đã đọc, còn more thì chỉ có thể đọc từ đầu tới cuối. Lệnh less có thể dùng phím mũi tên trên bàn phím để scroll lên xuống, lệnh more không có chức năng này.
Lệnh head
Mặc định, lệnh head sẽ hiển thị 10 dòng đầu tiên của file.
$ head /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
Nếu muốn chỉ định số dòng hiển thị thì thêm option -n
(hoặc --lines=...
).
$ head -n 2 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
Lệnh tail
Tương tự như lệnh head, nhưng thay vì hiện 10 dòng đầu tiên thì lệnh này sẽ hiển thị 10 dòng cuối cùng của file. Sử dụng option -n
hoặc --lines=...
để chỉ định số dòng. Tuy nhiên, nếu thêm dấu cộng (+) vào trước số dòng, thì cả lệnh head
và tail
sẽ in ra nội dung từ dòng đó trở đi.
$ tail -n +45 /etc/passwd
Một trong những tính năng nổi bật nhất của lệnh tail đó là khả năng xem log. Khi sử dụng option -f
, mọi dòng được thêm vào file sẽ được hiển thị real-time.
$ sudo tail -f /var/log/auth.log
Các lệnh summarizing
Lệnh đếm wc
Khi sử dụng lệnh wc
mà không có option, lệnh này sẽ in ra lần lượt theo thứ tự số dòng, số từ, số byte.
$ wc random.txt
5 9 52 random.txt
Một số option khác:
-c
(--bytes
): đếm số bytes-L
(--max-line-length
): hiển thị số bytes của dòng dài nhất-l
(-lines
): đếm số dòng-m
(--chars
): hiển thị số ký tự-w
(--words
): hiển thị số từ
Lệnh uniq
Lệnh này làm một trong những lệnh thao tác với tệp văn bản trong Linux, dùng để kiểm tra các dòng trùng nhau liền kề và chỉ hiển thị các dòng trùng nhau liền kề một lần duy nhất. Như ví dụ bên dưới, mặc dù cả dòng A và C đều lặp lại nhưng chỉ có hai dòng C liền kề nên lệnh uniq
loại bỏ một dòng, còn dòng A vẫn giữ nguyên.
$ cat NonUniqueLines.txt
A
C
C
A
$ uniq NonUniqueLines.txt
A
C
A
$
Nếu muốn mỗi dòng trùng nhau chỉ xuất hiện một lần duy nhất thì giải pháp ở đây là hãy dùng lệnh sort để sắp xếp trước, sau đó dùng lệnh uniq để loại bỏ dòng trùng.
$ sort NonUniqueLines.txt
$ uniq NonUniqueLines.txt
A
C
Tham số -c
hoặc -count
cho phép đếm số lần xuất hiện của mỗi dòng trùng.
$ sort NonUniqueLines.txt | uniq -c
2 A
2 C
Tham số -d
chỉ in ra những dòng được lặp lại (chỉ in ra 1 lần) và bỏ qua các dòng không bị lặp lại.
Các lệnh hàm băm
Lệnh md5sum
Sử dụng lệnh md5sum
để tính giá trị băm của một file.
$ md5sum file.txt
0ddaa12f06a2b7dcd469ad779b7c2a33
Lệnh md5sum
này cho giá trị đầu ra dài 128 bit. Mục đích của viêc băm là khi nếu bạn di chuyển file sang một vị trí khác, hoặc gửi file đi một nơi khác. Sau đó tính lại giá trị băm. Nếu giá trị lúc sau trùng với lúc đầu thì chứng tỏ file vẫn toàn vẹn, không bị chỉnh sửa hoặc mất mát.
Lệnh SHA
Các lệnh SHA cũng là các lệnh băm và chúng có mức độ bảo mật cao hơn md5sum
.
Để xem các lệnh SHA được hỗ trợ:
$ ls -1 /usr/bin/sha???sum
/usr/bin/sha224sum
/usr/bin/sha256sum
/usr/bin/sha384sum
/usr/bin/sha512sum
Thử sử dụng lệnh sha256
:
$ sha256sum fourtytwo.txt
0b2b6e2d8eab41e73baf0961ec707ef98978bcd8c7
74ba8d32d3784aed4d286b