Đưa ra lệnh sau:
echo "1: " | awk '/1/ -F ":" {print $1}'
Tại sao đầu ra awk:
1:
Đưa ra lệnh sau:
echo "1: " | awk '/1/ -F ":" {print $1}'
Tại sao đầu ra awk:
1:
Câu trả lời:
"-F" là một đối số dòng lệnh không phải cú pháp awk, hãy thử:
echo "1: " | awk -F ":" '/1/ {print $1}'
(pattern){action}
. Nếu pattern
(chủ yếu là một tuyên bố có điều kiện) là đúng , action
được thực thi. Nếu pattern
không có sẵn, true
được ngụ ý. Đây pattern
là /1/
trạng thái mà regex 1
khớp trong hồ sơ hiện tại$0
Nếu bạn muốn làm điều đó theo chương trình, bạn có thể sử dụng FS
biến:
echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'
Lưu ý rằng nếu bạn thay đổi nó trong vòng lặp chính thay vì BEGIN
vòng lặp, nó sẽ ảnh hưởng đến dòng tiếp theo được đọc, vì dòng hiện tại đã được tách.
Bạn có nhiều cách để đặt :
làm dấu phân cách:
awk -F: '{print $1}'
awk -v FS=: '{print $1}'
awk '{print $1}' FS=:
awk 'BEGIN{FS=":"} {print $1}'
Tất cả chúng đều tương đương và sẽ trả về 1
một đầu vào mẫu "1: 2: 3":
$ awk -F: '{print $1}' <<< "1:2:3"
1
$ awk -v FS=: '{print $1}' <<< "1:2:3"
1
$ awk '{print $1}' FS=: <<< "1:2:3"
1
$ awk 'BEGIN{FS=":"} {print $1}' <<< "1:2:3"
1
BEGIN
tuyên bố sẽ là chính xác nhất (phù hợp với awk
cú pháp tổng thể ).
BEGIN
nếu tôi sử dụng một tập tin để lưu trữ toàn bộ, trong khi -F
có ích với một lớp lót.
awk 'BEGIN{print split("foo:bar",a)}' FS=":" file
vàawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
Không cần phải viết nhiều như vậy. Chỉ cần đặt dấu tách trường mong muốn của bạn với tùy chọn -F trong lệnh awk và số cột bạn muốn in tách riêng theo phân cách trường được đề cập của bạn.
echo "1: " | awk -F: '{print $1}'
1
echo "1#2" | awk -F# '{print $1}'
1
AWK hoạt động như trình thông dịch văn bản đi theo chiều dọc cho toàn bộ tài liệu và đi theo từng trường cho từng dòng, do đó $ 1, $ 2 .. $ n là các tham chiếu đến các trường của mỗi dòng ($ 1 là trường đầu tiên, $ 2 là trường thứ hai, v.v. ...). Bạn có thể xác định dấu tách trường bằng cách sử dụng công tắc "-F" bên dưới dòng lệnh hoặc trong hai dấu ngoặc với "FS = ...". Bây giờ hãy xem xét câu trả lời của "JUERGEN":
echo "1: " | awk -F ":" '/1/ {print $1}'
Phía trên các ranh giới trường được đặt bởi ":" vì vậy chúng tôi có hai trường $ 1 là "1" và $ 2 là khoảng trống. Sau đó, xuất hiện biểu thức chính quy "/ 1 /" chỉ cho bộ lọc chỉ xuất ra trường đầu tiên khi trình thông dịch tình cờ phát hiện ra một dòng chứa biểu thức như vậy (ý tôi là 1); Đầu ra của lệnh "echo" là một dòng chứa "1" để bộ lọc sẽ hoạt động ...
Khi làm việc với ví dụ sau:
echo "1: " | awk '/1/ -F ":" {print $1}'
Cú pháp lộn xộn và trình thông dịch đã chọn bỏ qua phần F ":" và chuyển sang bộ tách trường mặc định là không gian trống, do đó xuất ra "1:" làm trường thứ nhất và sẽ không có trường thứ hai!
Câu trả lời của JUERGEN chứa cú pháp tốt ...