Các chương trình sed
và awk
thường làm việc của họ một cách lặng lẽ. Có cách nào để có được những chương trình này để nói những gì họ đang làm?In tiến độ chi tiết từ sed và awk
Trả lời
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
.
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.
Điều này có thể làm việc cho bạn (ví sed):
sed -i 's/foo/bar/;w /dev/stdout' files*
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
.
Để 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. –
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
Đâ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ý.
Đ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
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
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 stdin
và stdout
).
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
.
Lưu ý rằng điều này không hoạt động với các thay thế tại chỗ ... (AFAIK) – starryknight64
- 1. khác biệt giữa grep, awk và sed
- 2. Sed and Awk Escaping Ampersands (&)
- 3. Recursivley in chi tiết đối tượng
- 4. tập tin Python Chế độ chi tiết
- 5. sed/awk: Trích xuất mẫu từ luồng văn bản
- 6. Sự khác biệt giữa sed và awk là gì?
- 7. Sed/Awk - đường kéo giữa mẫu x và y
- 8. MVP và trình bày chi tiết
- 9. sed hoặc awk multiline thay thế
- 10. Nút tiết lộ chi tiết và phân đoạn
- 11. Lỗi chi tiết hơn từ createFileAtPath?
- 12. Chi tiết về Endian-ness và .Net?
- 13. Tiêu đề C++ - tách biệt giữa chi tiết giao diện và chi tiết triển khai
- 14. Xóa các dòng khỏi tệp với SED hoặc AWK
- 15. Nhận mức độ chi tiết của giao diện
- 16. Chi tiết của AsyncWaitHandle.WaitOne
- 17. Làm cách nào để tạo danh sách và chế độ xem chi tiết cho django-taggit?
- 18. Chi tiết của ứng dụng Danh bạ iPhone Xem chi tiết
- 19. Bật đầu ra chi tiết từ AntBuilder của groovy
- 20. Sử dụng sed hoặc awk để sửa định dạng ngày
- 21. Python hoặc awk/sed để làm sạch dữ liệu
- 22. Để biết chi tiết bảng
- 23. Chuyển hướng từ Chế độ xem chi tiết chung Xem trong Django
- 24. Chi tiết thời gian giữa 32bit và 64bit Windows
- 25. lỗi chi tiết về fopen
- 26. Backbone.js Kịch bản chi tiết chính
- 27. Tham gia hai dòng liên tiếp bằng awk hoặc sed
- 28. Tôi đang bối rối ở đây về awk, sed, v.v.
- 29. Ngừng xem chi tiết nhỏ
- 30. Nhận được nhiều hơn "chi tiết" từ MVC Mini Profiler
Đố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
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
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