awk: buộc một trạng thái trở lại?


17

Đây là một tiếp theo cho câu hỏi trước đây của tôi .

Tôi đang xác thực số lượng các trường trong / etc / passwd bằng cách sử dụng đoạn trích tiện dụng này. Trong ví dụ sau, người dùng 'fieldcount1' và 'fieldcount2' có số trường sai:

$ awk -F: ' NF!=7 {print}' /etc/passwd
fieldcount1:x:1000:100:fieldcount1:/home/fieldcount1:/bin/bash::::
fieldcount2:blah::blah:1002:100:fieldcount2:/home/fieldcount2:/bin/bash:
$ echo $?
0

Như bạn sẽ thấy, awk sẽ thoát với trạng thái trả về 0. Từ quan điểm của nó, không có vấn đề gì ở đây.

Tôi muốn kết hợp tuyên bố awk này vào một kịch bản shell. Tôi muốn in tất cả các dòng bị lỗi và đặt mã trả về là 1 (lỗi).

Tôi có thể cố gắng buộc một trạng thái thoát cụ thể, nhưng sau đó awk chỉ in một dòng duy nhất:

$ awk -F: ' NF!=7 {print ; exit 1}' /etc/passwd
fieldcount1:x:1000:100:fieldcount1:/home/fieldcount1:/bin/bash::::
$ echo $?
1

Tôi có thể buộc awk thoát với trạng thái trả về '1' và in tất cả các dòng khớp không?

Câu trả lời:


23

Giữ trạng thái trong một biến và sử dụng nó trong một ENDkhối.

awk -F: 'NF != 7 {print; err = 1}
         END {exit err}' /etc/passwd

Rất tốt. Tuy nhiên tôi đang gặp vấn đề khi kết hợp điều này vào một tập lệnh bash. Tôi đang cố gắng nắm bắt trạng thái trả về của câu lệnh awk này bằng cách thêm một cái gì đó giống như ; echo $?sau câu lệnh awk này. Tuy nhiên, echo $?không bao giờ được chạy vì END {exit err}'chấm dứt tập lệnh. Có cách nào để thiết lập trạng thái trả lại mà không thoát?
Stefan Lasiewski

6
@StefanLasiewski exit errchấm dứt awk, nó không chấm dứt tập lệnh. Bạn có set -etrong kịch bản đó không? Nếu vậy, bạn đã bảo shell thoát nếu một lệnh trả về trạng thái khác không; nếu bạn muốn kiểm tra trạng thái, sử dụng if awk …; then echo ok; else echo fail; fi.
Gilles 'SO- ngừng trở nên xấu xa'

@Giles: Có, tập lệnh này đã set -eđược đặt. Điều đó giải thích cho hành vi kỳ lạ mà tôi đang thấy. Cảm ơn đã chỉ ra rằng.
Stefan Lasiewski

1
Nếu bạn dự định sử dụng đầu ra với &&toán tử bash , bạn nên nhớ rằng "0 là đúng nhưng sai là 1 trong vỏ" .
Skippy le Grand Gourou

7

Tôi đang tìm kiếm một cái gì đó tương tự như grep, nơi nó sẽ thoát 1 nếu không tìm thấy kết quả khớp. Đây là tương đương với awk:

awk '
BEGIN   {z=1}
/bravo/ {z=0; print}
END     {exit z}
' alpha.txt

Thí dụ


0

Điều này không trả lời các yêu cầu chính xác của OP, nhưng nếu bạn chỉ quan tâm đến mã trả về và không cần in các dòng grep -qtrùng khớp, thì bạn có thể sửa đổi câu trả lời @geekasaur để thoát sau trận đấu đầu tiên, cho đầu vào lớn tập tin sẽ tiết kiệm thời gian nếu lỗi xảy ra sớm trong tập tin. Hy vọng /etc/passwdkhông đủ điều kiện cho bạn!

awk -F: 'NF != 7 {err = 1; exit;}
     END {exit err}' /etc/passwd

1
awk -F: 'NF != 7 {exit 1}'sẽ làm như vậy
Stéphane Chazelas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.