Giới thiệu
Nushell (nu) là một shell hiện đại, coi dữ liệu như thông tin có cấu trúc thay vì chỉ là văn bản thuần túy. Nó mang đến khả năng thao tác dữ liệu giống như bảng tính ngay trên dòng lệnh với hỗ trợ tích hợp cho các định dạng như JSON, CSV, YAML và nhiều định dạng khác.
Mục lục
- Cài đặt
- Khái niệm cơ bản
- Các lệnh chính và điều hướng
- Làm việc với dữ liệu có cấu trúc
- Định dạng dữ liệu
- Biến và cấu hình
- Tính năng nâng cao
- Mẹo hiệu suất
- Khắc phục sự cố
- Di chuyển từ shell truyền thống
- Kết luận
Cài đặt
Sử dụng Trình quản lý gói
bash
# macOS với Homebrew
brew install nushell
# Windows với Winget
winget install nushell
# Linux với Snap
snap install nushell
# Cargo (trình quản lý gói Rust)
cargo install nu
Từ GitHub Releases
Tải xuống các tệp nhị phân đã được xây dựng sẵn từ GitHub releases.
Khái niệm cơ bản
Triết lý dữ liệu có cấu trúc
Khác với các shell truyền thống hoạt động với các dòng văn bản, Nushell làm việc với dữ liệu có cấu trúc:
- Mọi thứ đều là bảng hoặc dữ liệu có cấu trúc
- Các pipeline truyền dữ liệu có cấu trúc giữa các lệnh
- Hiểu biết tích hợp về các định dạng dữ liệu thông dụng
Bắt đầu Nushell
bash
nu
Các lệnh chính và điều hướng
Đây là những lệnh cơ bản mà mọi lập trình viên đều biết, nhưng cách mà shell xử lý đầu ra sẽ khiến nhiều người ngạc nhiên. Tôi để lại những lệnh này cho những người mới bắt đầu, ai muốn học và làm chủ các lệnh cơ bản.
Điều hướng hệ thống tập tin
bash
# Liệt kê nội dung thư mục (đầu ra có cấu trúc)
ls
# Thay đổi thư mục
cd /duong/dan/den/thumuc
# Thư mục làm việc hiện tại
pwd
# Quay lại thư mục trước
cd -
# Về thư mục chính
cd ~
Các thao tác với tập tin
bash
# Tạo tập tin
touch file.txt
"Hello World" | save hello.txt
# Sao chép tập tin
cp source.txt destination.txt
# Di chuyển/đổi tên tập tin
mv oldname.txt newname.txt
# Xóa tập tin
rm file.txt
# Tạo thư mục
mkdir new-folder
# Xóa thư mục
rmdir empty-folder
rm -rf folder-with-contents
Làm việc với dữ liệu có cấu trúc
Xem dữ liệu
bash
# Xem nội dung tập tin
open data.json
open data.csv
open data.yaml
# Xem với phân trang
open large-file.txt | less
# Lấy thông tin tập tin
ls | get name size modified
Các lệnh thao tác dữ liệu
select - Chọn các cột cụ thể
bash
ls | select name size
ps | select name pid cpu
where - Lọc hàng
bash
ls | where size > 1mb
ps | where cpu > 50
ls | where name =~ "\.txt$" # regex match
sort-by - Sắp xếp dữ liệu
bash
ls | sort-by size
ls | sort-by modified --reverse
group-by - Nhóm dữ liệu
bash
ls | group-by type
ps | group-by user
get - Trích xuất các giá trị cụ thể
bash
ls | get 0 # Hàng đầu tiên
ls | get name # Tất cả tên
ls | get name.0 # Tên đầu tiên
length - Đếm mục
bash
ls | length
ps | where name =~ "python" | length
first và last - Lấy hàng cụ thể
bash
ls | first 5
ps | last 3
skip và take - Phân trang
bash
ls | skip 10 | first 5 # Bỏ qua 10 hàng đầu, lấy 5 hàng tiếp theo
Định dạng dữ liệu
JSON
bash
# Đọc JSON
open data.json
# Tạo JSON
{name: "John", age: 30} | to json
# In JSON đẹp
open data.json | to json --indent 2
CSV
bash
# Đọc CSV
open data.csv
# Tạo CSV
[{name: "Alice", age: 25}, {name: "Bob", age: 30}] | to csv
# Chuyển đổi các định dạng khác sang CSV
open data.json | to csv
YAML
bash
# Đọc YAML
open config.yaml
# Tạo YAML
{database: {host: "localhost", port: 5432}} | to yaml
Biến và cấu hình
Biến
bash
# Đặt biến
let name = "John"
let numbers = [1, 2, 3, 4, 5]
let config = {host: "localhost", port: 8080}
# Sử dụng biến
echo $name
echo $numbers
echo $config.host
Biến môi trường
bash
# Xem môi trường
env
# Đặt biến môi trường
$env.MY_VAR = "value"
# Sử dụng biến môi trường
echo $env.HOME
echo $env.PATH
Cấu hình
bash
# Xem cấu hình hiện tại
config
# Chỉnh sửa tệp cấu hình
config nu
# Đặt giá trị cấu hình
config set table.mode rounded
Tính năng nâng cao
Lệnh tùy chỉnh
bash
# Định nghĩa một lệnh tùy chỉnh
def greet [name: string] {
$"Hello, ($name)!"
}
# Sử dụng lệnh đó
greet "World"
# Lệnh với cờ
def search [pattern: string, --case-sensitive] {
if $case_sensitive {
ls | where name =~ $pattern
} else {
ls | where name =~ $"(?i)($pattern)"
}
}
Bí danh
bash
# Tạo bí danh
alias ll = ls -la
alias gs = git status
alias la = ls -a
# Xem bí danh
alias
Vòng lặp và điều kiện
bash
# Vòng lặp For
for file in (ls | get name) {
echo $"Processing ($file)"
}
# Each (cách tiếp cận hàm)
ls | each { |row| echo $"File: ($row.name)" }
# Điều kiện
if (ls | length) > 10 {
echo "Nhiều tập tin"
} else {
echo "Ít tập tin"
}
Xử lý lỗi
bash
# Tương đương với try-catch
try {
open nonexistent.txt
} catch {
echo "Tập tin không tìm thấy"
}
# Giá trị mặc định
open config.json | get database.port? | default 3000
Làm việc với các lệnh bên ngoài
Chạy các lệnh bên ngoài
bash
# Chạy các lệnh bên ngoài
^ls -la
^git status
^python script.py
# Ghi lại đầu ra dưới dạng dữ liệu có cấu trúc
^ps aux | from ssv # Giá trị phân tách bằng khoảng trắng
Phân tích đầu ra lệnh bên ngoài
bash
# Phân tích các định dạng khác nhau
^kubectl get pods -o json | from json
^docker ps --format json | lines | each { from json }
Các mẫu và ví dụ hữu ích
Phân tích log
bash
# Phân tích tệp log
open server.log
| lines
| parse "{timestamp} {level} {message}"
| where level == "ERROR"
| group-by level
| length
Giám sát hệ thống
bash
# Giám sát các tiến trình
ps | where cpu > 80 | sort-by cpu --reverse
# Kiểm tra dung lượng đĩa
ls | where type == dir | insert size_mb { |row| du $row.name | get physical | math sum | $in / 1mb }
Xử lý dữ liệu
bash
# Phân tích dữ liệu CSV
open sales.csv
| group-by region
| each { |group|
{
region: $group.0.region,
total_sales: ($group | get sales | math sum),
avg_sales: ($group | get sales | math avg)
}
}
Tích hợp Git
bash
# Trạng thái Git dưới định dạng có cấu trúc
def git-status [] {
^git status --porcelain | lines | parse "{status} {file}"
}
# Thông tin nhánh
def git-branches [] {
^git branch -v | lines | parse --regex "(?<current>[\*\s])\s+(?<name>\S+)\s+(?<hash>\S+)\s+(?<message>.*)"
}
Cấu hình và Tùy chỉnh
Cấu hình khởi động
Tạo ~/.config/nushell/config.nu:
bash
# Thông báo tùy chỉnh
$env.PROMPT_COMMAND = {
let path = ($env.PWD | str replace $env.HOME "~")
$"(ansi green)($path)(ansi reset) > "
}
# Bí danh tùy chỉnh
alias ll = ls -la
alias grep = rg
Tự động hoàn thành tùy chỉnh
bash
# Thêm vào config.nu
def "nu-complete git-branches" [] {
^git branch | lines | each { |line| $line | str trim | str replace "* " "" }
}
extern "git checkout" [
branch?: string@"nu-complete git-branches"
]
Mẹo hiệu suất
- Sử dụng các lệnh có cấu trúc thay vì phân tích bên ngoài khi có thể
bash
# Tốt
ls | where size > 1mb
# Ít hiệu quả hơn
^ls -la | from ssv | where size > 1mb
- Pipeline hiệu quả
bash
# Lọc sớm trong pipeline
ls | where type == file | where size > 1mb | sort-by size
- Sử dụng các lệnh tích hợp cho các định dạng dữ liệu
bash
# Phân tích JSON tích hợp nhanh hơn
open data.json | get users.0.name
Khắc phục sự cố
Nhận trợ giúp
bash
# Trợ giúp tổng quát
help
# Trợ giúp lệnh
help ls
help where
help config
# Liệt kê tất cả các lệnh
scope commands
Gỡ lỗi
bash
# Chế độ gỡ lỗi
$env.RUST_LOG = "debug"
# Đầu ra chi tiết
ls --help
# Kiểm tra loại lệnh
which ls
Di chuyển từ shell truyền thống
Các mẫu phổ biến từ Bash sang Nu
bash
# Bash: grep pattern file.txt
# Nu:
open file.txt | lines | where $it =~ "pattern"
# Bash: find . -name "*.txt" | wc -l
# Nu:
ls **/*.txt | length
# Bash: ps aux | grep python
# Nu:
ps | where name =~ "python"
# Bash: cat file.json | jq '.users[0].name'
# Nu:
open file.json | get users.0.name
Kết luận
Nushell đại diện cho một cuộc cách mạng trong thiết kế shell, coi dữ liệu như những công dân hàng đầu. Cách tiếp cận có cấu trúc của nó giúp thao tác dữ liệu trở nên trực quan và mạnh mẽ hơn so với các shell dựa trên văn bản truyền thống. Hãy bắt đầu với các lệnh cơ bản và dần dần kết hợp các tính năng nâng cao hơn khi bạn trở nên quen thuộc với triết lý dữ liệu có cấu trúc.
Và như thường lệ, đừng ngần ngại để lại ý kiến và phê bình bài viết này. Chúc bạn thành công!