(Edited: bài viết từ cuối 2011 – ID:110 – draft state bấm nhầm publish lỡ rồi thôi)
Grep
Tìm các dòng chứa chuỗi chuoi trong 1 files:
$ grep "chuoi" ten_file
.
Tìm các dòng chứa chuỗi chuoi trong nhiều files đuôi .txt:
$ grep "chuoi" *.txt
(Nếu dùng find để tìm CHUOI trong file .txt:
$ find . -name *.txt -exec grep CHUOI {} ;
hoặc
$ find . -name *.txt -print | xargs grep CHUOI
)
Tìm không phân biệt chữ hoa chữ thường: tùy chọn -i
$ grep -i "chuoi" ten_file
Tìm chính xác từ chuoi ko tinh chuỗi dài hơn như chuoichien : tùy chọn -w
$ grep -w "chuoi" ten_file
Tìm những dòng Không chứa chuoi (phủ định của tìm dòng chứa): tùy chọn -v
$ grep -v "chuoi" ten_file
Kết hợp lệnh ps để tìm process có tên java :
$ ps -ef | grep java
Ngoài ra còn có option -E để tìm theo RegEx, -F để tìm theo file.
Tìm tất cả dòng có chứa github hoặc bitbucket trong config các repository Git:
$ grep -E "github|bitbucket" */.git/config
Một số Linux distro sẽ có egrep tương đương “grep -E” , và fgrep tương đương “grep -F” .
Ngoài ra còn option -A và -B cũng tương đối hữu ích.
.
Sed
Sed chủ yếu dùng để thay thế (substitute) các từ trong 1 văn bản, và có thể xuất kết quả ra output hoặc file khác (chứ ko nhất thiết đè lên file gốc).
Thay từ old (đầu tiên) bằng từ new trong file filename.txt :
$ sed -i 's/old/name/' filename.txt
Thay từ old (tất cả) bằng từ new trong file filename.txt :
$ sed -i 's/old/name/g' filename.txt
Nếu không thay thế trực tiếp (in place) thì ko cần option -i , có thể append/output ra file mới:
$ sed 's/old/name/g' filename.txt > newfile.txt
VD: thay URL HTTPS sang GIT trong .git/config file của 1 Git Repository:
Repo https://github.com/ducquoc/euler-fun
sẽ có dòng sau trong file config trong thư mục .git ở root dir repo:
[remote "origin"] url = https://github.com/ducquoc/euler-fun.git
thì sau khi chạy dòng sed sau sẽ thay giao thức HTTPS bằng Git over SSH:
$ sed -i 's/https:\/\/github.com\/ducquoc/git@github.com:ducquoc/g' euler-fun/.git/config
(dấu backslash \ để escape ký tự slash / trong regular expression ). Kết quả:
[remote "origin"] url = git@github.com:ducquoc/euler-fun.git
Áp dụng tương tự cho các Git repository ở bitbucket:
$ grep -E "bitbucket|github" */.git/config $ sed -i 's/https:\/\/ducquoc@bitbucket.org\/ducquoc/git@bitbucket.org:ducquoc/g' */.git/config
.
Awk
Ứng dụng để dò git remote URL (chỉ in ra URL – cột 2 – sau khi grep) trong Git repository:
$ git remote -v | grep origin | awk '{print $2}'
(có thể assign vào biến shell script để xử lý tiếp)
Ứng dụng tìm process, lọc PID và xử lý :
$ ps -ef | grep PROCESS | grep -v grep | awk '{print $2}' | xargs kill -9
(kill -9 tương đương kill -s SIGTERM để tắt tất cả process input)
Tương tự:
$ ps -ef | awk '/PROCESS/ && !/awk/ {print $2}' | xargs -r kill -9
.
Ngoài ra awk có vài anh em họ: gawk, nawk, mawk – bổ sung một số tính năng nâng cao. Ở đây chỉ giới thiệu cơ bản awk , các command ở trên cũng ra cùng kết quả nếu dùng các chú kia.
Thế nên ai muốn tìm hiểu thêm xin cứ tự nhiên hỏi … Mrs. Google :D .
.
Bonus:
* nohup để giữ process vẫn chạy sau khi user ko còn login:
$ nohup /usr/bin/php long_running_process.php > /var/log/nohup_long_running_process.log &
* Liệt kê các file backups và xóa bớt những file quá hạn với xargs và rm -rf :
$ ls -td1 /data/backup/*/ | tail -n +4 | xargs -r rm -rfv 2> /var/log/backup_cleaner.log
.
Update 2018
Git đã hỗ trợ thay scheme Git bằng HTTPS và ngược lại, built-in hẳn vào git. Cho nên nếu chỉ 1 repo và đang đứng ơ đó thì ko cần dùng sed để substitute/replace như ở trên nữa:
$ git remote set-url origin git@github.com:USERNAME/REPOSITORY.git
./.