Xuất ra thiết bị xuất chuẩn và đồng thời grep vào một tệp


18

Tôi có một kịch bản xuất văn bản thành stdout. Tôi muốn xem tất cả đầu ra này trong thiết bị đầu cuối của mình, đồng thời tôi muốn lọc một số dòng và lưu chúng trong một tệp. Thí dụ:

$ myscript
Line A
Line B
Line C

$ myscript | grep -P 'A|C' > out.file

$ cat out.file
Line A
Line C

Tôi muốn xem đầu ra của lệnh đầu tiên trong terminal và lưu đầu ra của lệnh thứ hai trong một tệp. Đồng thời. Tôi đã thử sử dụng tee, nhưng không có kết quả, hoặc tốt hơn, với kết quả đảo ngược .

Câu trả lời:


27

Tôi muốn xem đầu ra của lệnh đầu tiên trong terminal và lưu đầu ra của lệnh thứ hai trong một tệp.

Miễn là bạn không quan tâm xem những gì bạn đang xem là từ thiết bị xuất chuẩn hay thiết bị xuất chuẩn , bạn vẫn có thể sử dụng tee:

myscript | tee /dev/stderr | grep -P 'A|C' > out.file

Sẽ hoạt động trên linux; Tôi không biết liệu "/ dev / stderr" có thể áp dụng như nhau trên các * nix khác không.


9
/dev/stderrlà phổ biến. /dev/tty(có nghĩa là thiết bị đầu cuối hiện tại) cũng sẽ hoạt động ở đây và đó là tiêu chuẩn .
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles: Tuyệt vời. tee /dev/ttyđã phục vụ tuyệt vời cho yêu cầu của tôi là phải in stdouttập lệnh tới thiết bị đầu cuối và chuyển nó sang stdinlệnh khác! Thankees! :-)
jamadagni

8
{ ... | tee /dev/fd/3 | grep -e A -e C > out.file; } 3>&1

Hoặc với quá trình thay thế (ksh93, zsh hoặc bash):

... | tee >(grep -e A -e C > out.file)

Với zsh:

... >&1 > >(grep -e A -e C > out.file)

Tôi thấy tôi phải sử dụng cái đầu tiên vì nó bảo toàn mã thoát của grep. Ngoài ra, nếu vì lý do nào đó bạn không thể truy cập hệ thống tập tin / dev, thì /dev/fd/3có thể thay thế bằng>(cat 1>&3)
golvok

4

Đây là một cách khác với sed:

myscript | sed '/PATTERN/w out.file'

Theo mặc định, sedin mọi dòng vì vậy trong trường hợp này, thiết bị xuất chuẩn sẽ giống như stdin (tức là bạn sẽ thấy toàn bộ đầu ra của myscriptmàn hình).
Ngoài ra, tất cả các dòng khớp PATTERNsẽ được wchuyển sangout.file


-1

bạn đã không chỉ định cách bạn sử dụng lệnh tee nhưng điều này sẽ hoạt động:

myscript | grep -P 'A|C' | tee out.file

ít nhất nó đã hoạt động trên máy chủ của tôi vài phút trước ...


4
Nhưng, nếu tôi không sai, bằng cách này, bạn cũng grep những gì trên màn hình. Tôi muốn xem tất cả đầu ra trên màn hình và chỉ lọc những gì đi vào tệp.
lorenzo-s
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.