標準輸出,標準錯誤,還有什麼?(瘋狂解析 slapadd 輸出)
我正在使用
slapadd
恢復備份。該備份包含 45k 個條目,需要一段時間才能恢復,因此我需要從slapadd
. 幸運的是,有一個-v
開關可以提供與此類似的輸出:添加:“mail=1@test.org,ou=People,dc=example,dc=org”(00003d53) 添加:“mail=2@test.org,ou=People,dc=example,dc=org”(00003d54) 添加:“mail=3@test.org,ou=People,dc=example,dc=org”(00003d55) .######## 44.22% eta 05m05s 經過 04m spd 29.2 k/s 添加:“mail=4@test.org,ou=People,dc=example,dc=org”(00003d56) 添加:“mail=5@test.org,ou=People,dc=example,dc=org”(00003d57) 添加:“mail=6@test.org,ou=People,dc=example,dc=org”(00003d58) 添加:“mail=7@test.org,ou=People,dc=example,dc=org”(00003d59)
每添加 N 個條目,
slapadd
寫入一個.######## 44.22% eta 05m05s elapsed ...
我想要保留的進度更新輸出行 ( ),並為創建的每個我想隱藏的條目寫入一個輸出行,因為它公開了人們的電子郵件地址,但仍想計算他們以了解導入了多少使用者我想隱藏電子郵件和顯示進度更新的方式是這樣的:
$ slapadd -v ... 2>&1 | tee log.txt | grep '########' # => would give me real-time progress update $ grep "added" log.txt | wc -l # => once backup has been restored I would know how many users were added
我嘗試了上述的不同變體,無論我嘗試什麼,我都無法 grep 進度更新輸出行。
我追踪
slapadd
如下:sudo strace slapadd -v ...
這就是我得到的:
write(2, "added: \"mail=3@test.org"..., 78added: "mail=3@test.org,ou=People,dc=example,dc=org" (00000009) ) = 78 gettimeofday({1322645227, 253338}, NULL) = 0 _######## 44.22% eta 05m05s elapsed 04m spd 29.2 k/s ) = 80 write(2, "\n", 1 )
如您所見,百分比線未發送到
stdout
orstderr
(僅供參考,我已使用已知的工作和失敗命令進行驗證,即2
isstderr
和1
isstdout
)**Q1:進度更新輸出線去哪了?
Q2:如何在將 stderr 發送到文件時對其進行 grep?**
附加資訊:我正在
Openldap 2.4.21
執行ubuntu server 10.04
第一次更新:可能相關的資訊
來自 http://www.openldap.org/lists/openldap-bugs/200903/msg00235.html
(“儀表”是我在“進度更新輸出線”上方所說的)
> No, the code only enables the meter if stdout (was: stderr) is a tty, so > redirecting it anywhere disables it. The meter was enabled both by > "slapadd -l file" and "slapadd< file", but "cat file | slapadd" did > disable it. IMHO not exactly an obvious way..
我的問題仍然存在,因為我不知道如何處理這些附加資訊。
你被一個有趣的行為咬傷了
slapadd
。開發人員的郵件列表上對此進行了討論。底線是,在重定向 stderr 時,進度表似乎被禁用,或者僅在 STDIN 是 tty 時才啟用(根據一些Google搜尋,我無法得出明確的結論 - 似乎你需要深入研究程式碼! )。除此之外,你在正確的軌道上。對於第二季度;我不太確定您的問題,但是要將 STDERR 重定向到文件,只需執行
slapadd -v ... 2>YOURFILE
. 這樣你仍然可以在 STDOUT (1) 上使用 grep。