stdout,stderr,还有什么? (疯狂parsingslapadd输出)

我正在使用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 ... ),并为每个创build的条目创build一个输出行,因为我想隐藏它暴露了人们的电子邮件地址,但仍然要计算他们知道有多less用户import

我想隐藏电子邮件和显示进度更新的方式是这样的:

 $ 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: \"[email protected]"..., 78added: "[email protected],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 ) 

正如你所看到的,百分比线不会被发送到stdoutstderr (FYI我已经validation了已知的工作和失败的命令, 2stderr1stdout

Q1:进度更新输出行在哪里?
Q2:在发送stderr到一个文件的时候,我怎么能这样?

其他信息:我在ubuntu server 10.04上运行Openldap 2.4.21

第一次更新:潜在的相关信息

从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一个有趣的行为咬伤了。 有关于开发者的邮件列表的讨论。 最重要的是,当redirectstderr时,进度计似乎被禁用, 或者只有在STDIN是tty的情况下启用(我无法根据几个谷歌search来得出确定的结论 – 似乎你需要深入代码! )。

除此之外,你在正确的轨道上。 对于Q2; 我不太确定你的问题在这里,但redirectSTDERR到一个文件,只是做slapadd -v ... 2>YOURFILE 。 这样你仍然可以在STDOUT(1)上进行grep。