New FAMILUG

The PyMiers

Saturday 10 November 2012

[CCGU] awk - pattern scanning and text processing language

Tiếp tục loạt bài viết CCGU, tớ sẽ giới thiệu 2 công cụ cực mạnh để xử lý text là sed và awk.
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 sed
sed (1) - stream editor for filtering and transforming text
hvn@lappy: ~ $ whatis awk
awk (1) - pattern scanning and text processing language
awk có tính năng xử lý dữ liệu theo cột, còn sed thì lại xử lý theo dòng.
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}'
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
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!

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

6 comments:

  1. Trước anh dùng bash+awk+curl để viết tool cảnh báo tấn công Ikariam qua SMS =)

    Cò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

    ReplyDelete
    Replies
    1. Chú thích là viết từ hồi chưa học Python :D

      Delete
    2. remove comment, remove tab, remove empty line :D may mà vẫn còn đọc được :D

      Delete
  2. câu lệnh sed của ngày hôm nay , yahoo \m/

    sed -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`

    ReplyDelete
  3. câu lệnh sed của ngày hôm nay :x

    grep -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'

    ReplyDelete
  4. Với câu lệnh này:

    ip ad | grep inet | awk '{print $2}'

    nên viết lại thành:

    ip ad | awk '/inet/ {print $2}'

    ReplyDelete