Saturday, 31 October 2020

grep không hỗ trợ \d và 3 mode regex trong grep

grep là công cụ thiết yếu của sysadmin, tác dụng cơ bản là tìm một mẫu string trong 1 file text. 

Cái tên grep bắt nguồn từ câu lệnh g/re/p của chương trình ed

> Its name comes from the ed command g/re/p (globally search for a regular expression and print matching lines)

Biết thêm một chút regex sẽ tăng thêm sức mạnh. Ví dụ in ra shell của các user trên máy:

$ grep -o '/bin/.*sh' /etc/passwd

/bin/bash
/bin/sh

Photo by Percy Pham on Unsplash

Một "pattern" phổ biến là tìm số, nếu đã từng lập trình dùng regex, thì \d không còn lạ gì để tìm số - code Python ngay trên CLI:

$ echo '123ab45' | python3 -c '
> import re, sys
> print(re.findall("\d+", sys.stdin.read()))'
['123', '45']

Nhưng thật bất ngờ, grep trên Ubuntu 18.04 không hỗ trợ pattern này:

$ echo '123ab45' | grep -o '\d+'

# không in ra gì