Grep Sed Awk

 

 

(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-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 xargsrm -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

 

 

./.

About DucQuoc.wordpress.com

A brother, husband and father...
This entry was posted in Coding, Linux. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s