2012-03-23 27 views

Trả lời

4

Nếu bạn đang chuyển hướng đầu ra của sed hoặc awk vào một tập tin (thay vì sửa đổi file tại chỗ), bạn có thể cho pv ("xem ống") một shot:

sed -e '...' input.txt | pv > output.txt 

Bạn có thể sử dụng pv -l để báo cáo sự tiến bộ trong các dòng được viết. Trạng thái tiến trình được in thành stderr trong khi dữ liệu thực tế di chuyển dọc theo số stdin đến stdout.

4

Bạn luôn có thể nói awk để in các hồ sơ đầu vào, ví dụ:

awk '{ 
     print "#dbg:$0="$0 
     # do more stuff 
     print $1 
     # or make it conditional 
     if ($0 ~ /specialRegEx/){ 
       print "#dbg:$0="$0 
     } 
     }' infile 

Với sed, bạn sử dụng 'p' cmd để in mỗi dòng, mặc dù, mặc định là in mỗi dòng. Một cái gì đó như

sed 'p 
     # also "=" prints line # being processed 
     = 
     /specialRegEx/{ 
     s/xxx/yyy/ 
     p 
     }' infile 

Tôi hy vọng điều này sẽ hữu ích.

5

Điều này có thể làm việc cho bạn (ví sed):

sed -i 's/foo/bar/;w /dev/stdout' files* 
+0

Đối với tôi lệnh -i trong lệnh gốc không hoạt động trên OS X. Có thiếu -e không? – Paul

+0

Nhận xét của Paul: Ví dụ làm việc sử dụng sed cho OS X: '$ echo hello> test $ sed -e 's/ll/zz /; w/dev/stdout' -i .backup test hezzo $ cat kiểm tra hezzo $ cat test.backup hello' – StuartLC

+1

Paul: Mac OS X sử dụng phiên bản BSD của sed, hoạt động khác theo một số cách cho phiên bản GNU thường được tìm thấy trên các hệ thống Linux. Với BSD sed bạn phải luôn luôn chỉ định * một số * mở rộng cho -i, trong khi GNU sed giải thích không có gì là một chuỗi rỗng. Vì vậy, BSD sed tương đương với 'sed -i' của GNU sed đơn giản là 'sed -i' ''. Các ví dụ của StuartLC hoạt động giống nhau trên cả hai phiên bản vì anh ấy không chỉnh sửa tệp tại chỗ (tức là anh ấy đang sử dụng các phần mở rộng không có độ dài 0, do đó không chạy vào sự khác biệt nhỏ này). – robo

3

Nếu bạn đang trên Linux, bạn có thể xem tiến độ của quá trình đó được xử lý một tập tin lớn bằng cách nhìn vào /proc/<pid>/fdinfo. Có một mục nhập cho mỗi bộ mô tả tệp mở và nếu bạn nhập các mục nhập, chúng sẽ hiển thị cho bạn vị trí đọc/ghi của bộ mô tả tệp. Vì vậy, bạn có thể thấy rằng bạn đang 1123456 byte vào tệp. Tên đường dẫn của tệp đang mở nằm trong một khu vực khác: /proc/<pid>/fd, được biểu thị dưới dạng liên kết tượng trưng.

Trước khi tôi xem xét điều đó, tôi thường đính kèm một số strace vào quy trình: strace -p <pid>. Bạn có thể sử dụng để xem những gì hệ thống gọi là quá trình làm: đọc và ghi tập tin, và phân bổ bộ nhớ với brk hoặc mmap.

+0

Để thuận tiện: 'ps axe | grep foo' trong đó 'foo' là tên của chương trình được đề cập có thể được sử dụng để tìm id tiến trình để sử dụng ở trên. –

5

Với giả định rằng bạn đang tạo đầu ra sed cho một tệp, bạn có thể sử dụng lệnh đuôi (trong một thiết bị đầu cuối khác) để liên tục xem kết thúc tệp; sao cho bạn có thể thấy sự tiến bộ.

tail -f output_from_sed.txt 
2

Đây có thể không chính xác những gì bạn đang tìm nhưng nó có thể giúp người khác. FWIW:
gawk -W dump-variables=/tmp/awk.log
sẽ đổ các giá trị biến ở cuối tập lệnh vào tệp nhật ký.

7

Điều này dựa trên câu trả lời của potong. Đoạn mã sau thay thế 'll' bằng 'zz', tạo một tệp sao lưu, hiển thị văn bản mới và viết (các) thay đổi vào tệp.

$ echo hello > test 
$ sed -e 's/ll/zz/;w /dev/stdout' -i .backup test 
hezzo 
$ cat test 
hezzo 
$ cat test.backup 
hello 
+2

Trong các phiên bản sed mới hơn, nếu dấu chấm phẩy trước khi bỏ qua w, thì w sẽ trở thành một đối số cho lệnh sed "s" và chỉ những thay đổi được ghi vào/dev/stdout, mà với tôi hữu ích hơn viết toàn bộ tệp – Jack

0

Các "quyền" trả lời ở đây là

pv myfile.txt | sed ... 

câu trả lời Eduardo Ivanec là gần, nhưng bằng cách sử dụng trình xem ống (pv) để làm đường ống thực tế, bạn có thể biết những gì tiến bộ của bạn là trong tệp (dưới dạng phần trăm, bao gồm số liệu thống kê tuyệt vời như M/giây, tổng dữ liệu, v.v.).

pv công trình như cat (đọc các tập tin và xuất khẩu trực tiếp đến stdout, hoặc trong trường hợp của đường ống trong, đó là một cầu nối giữa stdinstdout).

Quan trọng, vì pv là "quy trình đường ống trong suốt", stdout bị chiếm dụng với dữ liệu chuyển tiếp. Vì vậy, báo cáo tiến độ được báo cáo qua stderr.

+0

Lưu ý rằng điều này không hoạt động với các thay thế tại chỗ ... (AFAIK) – starryknight64

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