Trong quá trình phân tích dữ liệu, tôi thường làm việc trực tiếp trên môi trường UNIX. Nơi mà bạn chỉ có màn hình nền đen chữ trắng (terminal, command line) để tương tác với hệ thống (thu thập, quan sát, chỉnh sửa, chia sẻ dữ liệu). Lý do là vì bạn thường phải thuê server bên ngoài như Amazon và họ chỉ cung cấp cho bạn môi trường tương tác chính là từ dòng lệnh. Bài viết này xin tổng hợp lại những command line mà tôi thường dùng nhất để tiện cho các bạn mới nhập môn tham khảo và áp dụng.
Hy vọng sự linh hoạt của các dòng lệnh này có thể giúp bạn trở thành một nhà khoa học dữ liệu hiệu quả và năng suất hơn. Bạn sẽ học được cách kết hợp các công cụ dòng lệnh nhỏ nhưng mạnh mẽ này với nhau để nhanh chóng thu thập, khám phá và xây dựng mô hình dữ liệu của bạn.
Download file
Áp dụng trong tình huống bạn muốn download/upload dữ liệu từ bên ngoài qua giao thức HTTP hoặc SSH. Hay khi bạn cung cấp một reproducible document gồm các thư viện cần cài đặt để chia sẻ cho các nhóm làm việc của mình, nhờ vậy mà mọi người không cần mất công phải mở browser và đi vào từng trang web để download/upload.
HTML protocol
curl -O https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-3.2.10.tgz
SSH protocol
scp mongodb-osx-ssl-x86_64-3.2.10.tgz ubuntu@192.168.1.1:~/hong/ # upload file to server scp ubuntu@192.168.1.1:~/hong/mongodb-osx-ssl-x86_64-3.2.10.tgz ~/Download/ # download file from server
Quản lý các tiến trình
Nếu bạn làm việc với Big Data thì chắc chắn bạn không chỉ đơn thuần làm việc với Spark hay MongoDb mà còn nhiều công nghệ khác như NodeJs, Redis, Nginx, Jenkin, Glassfish, Mesos, … Việc theo dõi/monitor sự hoạt động của các tiến trình là cần thiết khi ứng dụng của bạn đã online. Các lệnh dưới đây giúp bạn bắt bệnh và chữa bệnh nhanh chóng khi hệ thống của bạn gặp trục trặc về hiệu suất có thể dẫn đến sụp đổ.
Xem top các tiến trình đang hoạt động, sắp xếp theo cpu/mem/…
top -o cpu
Xem tất cả các tiến trình
Dùng để in ra tất cả các tiến trình dưới dạng danh sách. Từ đó, ta có thể kết hợp với cơ chế pipe “|” để tìm kiếm, lọc ra các tiến trình ta muốn quan sát và xử lý.
ps aux # liệt kê tất cả các tiến trình ps aux | grep spark # tìm tiến trình tên spark
ps = processes
a = xem tiến trình của all users
u = hiển thị tiến trình của user/owner
x = hiển thị các tiến trình khác
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND hongong 2430 49.8 11.7 4381484 985460 ?? S 5:39PM 3:54.26 /Applications/WordPress.com.app/Contents/Frameworks/WordPress _windowserver 160 14.9 1.1 4500692 91072 ?? Ss 11:45AM 16:47.90 /System/Library/PrivateFrameworks/SkyLight.framework/Resource hongong 2428 9.0 2.0 4202740 166116 ?? S 5:39PM 1:04.25 /Applications/WordPress.com.app/Contents/MacOS/WordPress.com
Tắt một tiến trình khi biết trước mã của tiến trình (pid)
kill –
kill -9 24601
Tắt một tiến trình khi biết trước một phần tên của tiến trình
pkill – -f
pkill -15 -f spring
Tìm kiếm bằng lệnh Zgrep/Grep
zgrep/grep -i # tìm dòng nội dung khớp với chuỗi tìm kiếm (zip file thì dùng zgrep) # các option -n: hiển thị số dòng -i: không phân biệt hoa thường -r: đệ quy qua các file -c: đếm số dòng khớp với lệnh tìm kiếm -v: phủ định kết quả tìm kiếm --color: hiển thị màu kết quả khớp lệnh
Tìm kiếm bằng lệnh find
find path expression # template tìm kiếm find ~/Document -name "someimage.jpg" # ví dụ find ~ -name *.plist -and -not -path *QuickTime* -and -not -path *Preferences* # kết hợp tìm kiếm loại trừ
Quan sát log file
Khi phát triển các ứng dụng lớn, bạn nên lưu lại lịch sử của các tiến trình thực thi. Mỗi khi gặp sự cố, bạn có thể lần lại để bắt bệnh và sửa chữa kịp thời. Tuy nhiên, các file log thường rất lớn, có khi lớn hơn cả dữ liệu bạn sử dụng (có khi lên đến vài chục Gb) nên bạn không thể sử dụng các editor thông thường để mở. Vì vậy, học cách quan sát và tương tác với file log giúp bạn tiết kiệm thời gian và tài nguyên hệ thống nhiều hơn.
Sử dụng lệnh cat/less
cat error.log # in toàn bộ nội dung less error.log # in một phần nội dung, có thể điều hướng bằng các phím như j, k, l, h, ... less -N error.log # như trên nhưng có đánh chỉ số dòng less -M error.log # như trên nhưng hiển thị thêm thông tin phần trăm
Cách di chuyển trong LESS
spacebar|^F cuộn qua một trang tiếp theo ^B cuộn qua một trang trước đó G di chuyển đến cuối file 10G di chuyển đến đầu dòng thứ 10 / tìm string khớp với nội dung file n di chuyển đến kết quả tìm kiếm tiếp theo N di chuyển đến kết quả tìm kiếm trước đó q thoát
Sử dụng lệnh tail/head
tail/head là hai lệnh tương tự nhau, một lệnh để xem các dòng cuối của file và một lệnh để xem các dòng đầu tiên của file.
tail error.log # xem top 10 dòng cuối file tail -n 100 error.log # xem top 100 dòng cuối file tail -n 100 error.log | more # xem top 100 dòng cuối file, đọc theo định dạng của lệnh less
Xem hướng dẫn
Giúp tìm hiểu thêm về các thông số của lệnh mà bạn đang muốn sử dụng.
$man tail TAIL(1) BSD General Commands Manual TAIL(1) NAME tail -- display the last part of a file SYNOPSIS tail [-F | -f | -r] [-q] [-b number | -c number | -n number] [file ...] DESCRIPTION The tail utility displays the contents of file or, by default, its standard input, to the standard output. The display begins at a byte, line or 512-byte block location in the input. Numbers having a leading plus (`+') sign are relative to the beginning of the input, for example, ``-c +2'' starts the display at the second byte of the input. Num- bers having a leading minus (`-') sign or no explicit sign are relative to the end of the input, for example, ``-n 2'' displays the last two lines of the input. The default starting location is ``-n 10'', or the last 10 lines of the input.
Nén và giải nén file
Bạn sẽ thật sự cảm ơn những người đã phát minh ra giải thuật nén và giải nén. Nhờ có họ mà dữ liệu truyền qua internet được giảm tải xuống từ 40-50%, giúp tiết kiệm rất nhiều thời gian và chi phí download/upload.
# ZIP – Cross Platform zip -r archive_name.zip folder_to_compress # To compress unzip archive_name.zip # To extract zip -r -X archive_name.zip folder_to_compress # make a zip without those invisible Mac resource files such as “_MACOSX” or “._Filename” and .ds store files, use the “-X” option. # TAR.GZ – Cross Platform tar -zcvf archive_name.tar.gz folder_to_compress # To compress tar -zxvf archive_name.tar.gz # To extract # TAR.BZ2 – Cross Platform tar -jcvf archive_name.tar.bz2 folder_to_compress # To compress tar -jxvf archive_name.tar.bz2 # To extract # GZ gzip folder_to_compress # To compress gunzip archivename.gz # To extract
Editing dòng lệnh
Lưu ý: terminal/command line không phải editor quen thuộc nên các phím điều hướng sẽ khác đôi chút. Do đó, các bạn mới làm quen nên tập sử dụng các phim tắt dưới đây để hạn chế sự lúng túng và mất thời gian khi điều hướng qua lại giữa các lệnh.
Kí hiệu ^: Control
⌃C|D huỷ lệnh bất kỳ ⌃A di chuyển đến đầu dòng ⌃E di chuyển đến cuối dòng ⌃U xoá từ con trỏ đến hết đầu dòng ⌃K xoá từ con trỏ đến hết cuối dòng ⌃W xoá một từ nằm trước con trỏ Option + click line di chuyển con trỏ đến vị trí click Tab Tab hiển thị danh sách các khả năng cho auto-complete Cmd + ~ focus qua lại giữa các màn hình Terminal
Source code highlight cho Vi/Vim
cd ~ vi .vimrc # gõ phím i để chuyển qua chế độ nhập liệu filetype on syntax on # gõ phím esc để chuyển qua chế độ view # gõ : x để lưu và thoát màn hình soạn thảo
Mở một file .py với Vi/Vim, ta sẽ có highlight như bên dưới
Khác
history # xem những lệnh bạn thực thi mkdir -p webapp/application/controllers # tạo folder lồng nhau > output.txt # xuất kết quả terminal ra file >> # ghi tiếp kết quả terminal ra file diff # so sánh nội dung hai file wc server.log # đếm số từ trong file truncate -s0 *.log # xoá nội dung log ls -lah # list danh sách file/folder với thông tin size được thu gọn
Just for fun
say "Hong is handsome" cal 11 2016 November 2016 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 cal -y 2016 2016 January February March Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 2 1 2 3 4 5 6 1 2 3 4 5 3 4 5 6 7 8 9 7 8 9 10 11 12 13 6 7 8 9 10 11 12 10 11 12 13 14 15 16 14 15 16 17 18 19 20 13 14 15 16 17 18 19 17 18 19 20 21 22 23 21 22 23 24 25 26 27 20 21 22 23 24 25 26 24 25 26 27 28 29 30 28 29 27 28 29 30 31 31 April May June Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 2 1 2 3 4 5 6 7 1 2 3 4 3 4 5 6 7 8 9 8 9 10 11 12 13 14 5 6 7 8 9 10 11 10 11 12 13 14 15 16 15 16 17 18 19 20 21 12 13 14 15 16 17 18 17 18 19 20 21 22 23 22 23 24 25 26 27 28 19 20 21 22 23 24 25 24 25 26 27 28 29 30 29 30 31 26 27 28 29 30 July August September Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 2 1 2 3 4 5 6 1 2 3 3 4 5 6 7 8 9 7 8 9 10 11 12 13 4 5 6 7 8 9 10 10 11 12 13 14 15 16 14 15 16 17 18 19 20 11 12 13 14 15 16 17 17 18 19 20 21 22 23 21 22 23 24 25 26 27 18 19 20 21 22 23 24 24 25 26 27 28 29 30 28 29 30 31 25 26 27 28 29 30 31 October November December Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 1 2 3 4 5 1 2 3 2 3 4 5 6 7 8 6 7 8 9 10 11 12 4 5 6 7 8 9 10 9 10 11 12 13 14 15 13 14 15 16 17 18 19 11 12 13 14 15 16 17 16 17 18 19 20 21 22 20 21 22 23 24 25 26 18 19 20 21 22 23 24 23 24 25 26 27 28 29 27 28 29 30 25 26 27 28 29 30 31 30 31 banner -w50 'ong xuan hong'
Chào anh. anh đang sử dụng linux distro chính nào khi làm việc với ML vậy ạ?
ThíchThích
Ubuntu em
ThíchThích
Hay quá a 😀
ThíchThích