sed và awk đều là core utility của các hệ điều hành UNIX, Linux. Chúng vừa là tên 1 chương trình, vừa là tên 1 ngôn ngữ lập trình.
http://en.wikipedia.org/wiki/AWK
http://en.wikipedia.org/wiki/Sed
hvn@lappy: ~ $ whatis sedawk có tính năng xử lý dữ liệu theo cột, còn sed thì lại xử lý theo dòng.
sed (1) - stream editor for filtering and transforming text
hvn@lappy: ~ $ whatis awk
awk (1) - pattern scanning and text processing language
Bài này sẽ viết về awk và câu lệnh sử dụng awk phổ biến nhất ;) và một khi biết câu lệnh này rồi, đảm bảo bạn sẽ dùng nó rất thường xuyên:
hvn@lappy: ~/xzone $ awk -F ':' '{ print $1,$3 }' /etc/passwd
root 0
daemon 1
bin 2
sys 3
sync 4
games 5
man 6
Phân tích:
Cấu tạo của 1 câu lệnh awk hay sed đều có dạng cơ bản :
awk [option] 'cái gì đó' file_muon_doc
câu này thực hiện in ra các phần tử thứ 1 và thứ 3 ($1,$3) của mỗi dòng trong file /etc/passwd , các phần tử phân tách nhau bởi dấu hai chấm (-F ':') . Mặc định, awk dùng dấu cách để phân tách.
câu lệnh dưới đây sẽ in ra ip của tất cả các interface máy bạn đang dùng:
hvn@lappy: ~/xzone $ ip ad | grep inet | awk '{print $2}'2 ví dụ trên sử dụng câu lệnh awk phổ biến nhất để in ra các cột mà bạn mong muốn, dù bạn không có ý định học viết script bằng awk thì cũng nên biết câu lệnh này!
127.0.0.1/8
::1/128
192.168.0.103/24
fe80::4a5d:60ff:fe80:e55f/64
192.168.122.1/24
fe80::fc54:ff:fe8f:f0d7/64
Nếu có thời gian tớ sẽ viết thêm về awk sau khi tìm hiểu.
Còn sed thì để sau tính :D
happy Saturday!
PS: sed và awk đều là những ngôn ngữ đơn giản nên bạn không cần mất nhiều thời gian để trang bị cho mình 1 công cụ mạnh mẽ.
Danh sách các link để học thêm về awk
http://awk.info/?Learn
Trước anh dùng bash+awk+curl để viết tool cảnh báo tấn công Ikariam qua SMS =)
ReplyDeleteCòn sed thì học xong chắc cũng chỉ dùng mỗi câu lệnh:
sed -e 's/#.*//' -e 's/[ ^I]*$//' -e '/^$/ d' filename.conf
Chú thích là viết từ hồi chưa học Python :D
Deleteremove comment, remove tab, remove empty line :D may mà vẫn còn đọc được :D
Deletecâu lệnh sed của ngày hôm nay , yahoo \m/
ReplyDeletesed -i "s:archive']:&|replace\('file\://', ''\):g" `grep -Rin files_archive . | grep -v source | grep -v "if " | grep -v requirement | cut -d':' -f1 | sort -nr | uniq`
câu lệnh sed của ngày hôm nay :x
ReplyDeletegrep -v 'define service {' infra.jinja2 | grep -v 'use salt' | grep -v servicegroups | grep -v hostgroup | grep -v display_name | sed -e 's/check_command/check:/g' -e 's/service_description/description:/g'
Với câu lệnh này:
ReplyDeleteip ad | grep inet | awk '{print $2}'
nên viết lại thành:
ip ad | awk '/inet/ {print $2}'