2012-02-18 24 views
16

Tôi đang cố gắng học cách sử dụng awk nhưng nó không hoạt động như thế nào tôi mong đợi. Đây là sự cố của tôi:Tại sao awk in toàn bộ dòng thay vì trường đầu tiên?

$ echo "Hello brave new world" | awk "{print $1}" 
Hello brave new world 

Tôi dự kiến ​​sẽ thấy "Xin chào" vì đây là trường đầu tiên. Tại sao các không gian được tính là dấu phân tách trường?

+4

Vì vậy, bạn đã tìm hiểu thêm về lập trình shell hơn lập trình Awk; các câu trả lời cho đến nay là điểm trên. Luôn sử dụng dấu nháy đơn xung quanh tập lệnh - trừ khi có những lý do cực kỳ hợp lý để thực hiện khác. –

Trả lời

26

Đó là vì Bash đang diễn giải $1 như tham chiếu đến đối số trình bao đầu tiên, do đó, nó thay thế nó bằng giá trị của nó. Vì, trong trường hợp của bạn, tham số đó không được đặt, $1 chỉ được thay thế bằng chuỗi rỗng; để chương trình AWK của bạn thực sự chỉ là {print }, in toàn bộ dòng.

Để ngăn chặn Bash từ làm điều này, quấn chương trình AWK của bạn trong đơn có dấu ngoặc kép thay vì hai dấu ngoặc kép:

echo "Hello brave new world" | awk '{print $1}' 

hoặc

echo 'Hello brave new world' | awk '{print $1}' 
7
echo "Hello brave new world" | awk '{print $1}' 

Sử dụng dấu nháy đơn xung quanh chương trình awk , nếu không $ 1 được dịch là biến hệ vỏ $ 1

Các vấn đề liên quan