sh/bash/dash/ksh/zsh等Shell脚本
-
bones7456
- 帖子: 8495
- 注册时间: 2006-04-12 20:05
- 来自: 杭州
-
联系:
#1
帖子
由 bones7456 » 2008-08-11 22:22
代码: 全选
for i in `seq 10`;do echo "xxx (" $i"%) yyy"; sleep 0.1;done
这个是逐个输出的
代码: 全选
for i in `seq 10`;do echo "xxx (" $i"%) yyy"; sleep 0.1;done |cut -d " " -f 3
这个还是逐个输出的
代码: 全选
for i in `seq 10`;do echo "xxx (" $i"%) yyy"; sleep 0.1;done |cut -d " " -f 3 | cut -d "%" -f 1
为什么这个就不是了呢?这个是 命令执行完以后,一次性输出?为什么?
怀疑是管道问题,多个管道就会缓存,但是
代码: 全选
for i in `seq 10`;do echo "xxx (" $i"%) yyy"; sleep 0.1;done | tee | tee | cut -d " " -f 3
这又是逐行输出的,用了不止一个管道....
谁能在不改变前面for结构的情况下,逐行输出那些数字?
-
bones7456
- 帖子: 8495
- 注册时间: 2006-04-12 20:05
- 来自: 杭州
-
联系:
#2
帖子
由 bones7456 » 2008-08-11 22:25
PS:
代码: 全选
for i in `seq 10`;do echo "xxx (" $i"%) yyy"; sleep 0.1;done | awk -F '[ %]+' '{print $3}'
只有1个管道也有问题,看来不是管道的问题了?
是程序没有做 fflush ?
-
bones7456
- 帖子: 8495
- 注册时间: 2006-04-12 20:05
- 来自: 杭州
-
联系:
#3
帖子
由 bones7456 » 2008-08-12 10:20
新进展:
安装 gawk 之后.
代码: 全选
for i in `seq 10`;do echo "xxx (" $i"%) yyy"; sleep 0.1;done | gawk -F '[ %]+' '{print $3}'
是逐行输出的,但是两个管道又不行了:
代码: 全选
for i in `seq 10`;do echo "xxx (" $i"%) yyy"; sleep 0.1;done | gawk -F '[ %]+' '{print $3}' | gawk '{print $0}'
这个又是一次性输出了,郁闷中...
-
xiooli
- 帖子: 6956
- 注册时间: 2007-11-19 21:51
- 来自: 成都
-
联系:
#4
帖子
由 xiooli » 2008-08-12 10:33
晕乎哉,大不了先输一个临时文件里面再读出来呗,搞的好麻烦啊。
-
bones7456
- 帖子: 8495
- 注册时间: 2006-04-12 20:05
- 来自: 杭州
-
联系:
#5
帖子
由 bones7456 » 2008-08-12 10:36
xiooli 写了:晕乎哉,大不了先输一个临时文件里面再读出来呗,搞的好麻烦啊。
这和临时文件没关系,我是要用 zenity 显示进度的:
代码: 全选
for i in `seq 100`;do echo $i; sleep 0.1;done | zenity --progress --title "111" --text "22222" --percentage=0 --auto-close --width=500
这样是可以的
代码: 全选
for i in `seq 100`;do echo "xxx (" $i"%) yyy"; sleep 0.1;done | gawk -F '[ %]+' '{print $3}' | zenity --progress --title "111" --text "22222" --percentage=0 --auto-close --width=500
这样不会慢慢增加了,而是时间到了,再哗地一下,就完事了....
-
xiooli
- 帖子: 6956
- 注册时间: 2007-11-19 21:51
- 来自: 成都
-
联系:
#6
帖子
由 xiooli » 2008-08-12 10:56
:for i in `seq 100`;do echo "$i"; sleep 0.1;done |zenity --progress --title "111" --text "22222" --percentage=0 --auto-close --width=500
这样是可以的,你中间那个echo为何要弄成那样啊,又看不见?
-
bones7456
- 帖子: 8495
- 注册时间: 2006-04-12 20:05
- 来自: 杭州
-
联系:
#7
帖子
由 bones7456 » 2008-08-12 11:09
xiooli 写了::for i in `seq 100`;do echo "$i"; sleep 0.1;done |zenity --progress --title "111" --text "22222" --percentage=0 --auto-close --width=500
这样是可以的,你中间那个echo为何要弄成那样啊,又看不见?
不是我要把中间弄成那样啊,我前面那个for循环是模拟另一个程序的输出的啊.
其实就是 mencoder,输出的是类似这样的:
Pos: 3.6s 90f ( ??%) 0.00fps Trem: 0min 0mb A-V:0.023 [65:85]
我要把 ?? 取出来,给 zenity 用.
-
xiooli
- 帖子: 6956
- 注册时间: 2007-11-19 21:51
- 来自: 成都
-
联系:
#8
帖子
由 xiooli » 2008-08-12 11:27
bones7456 写了:xiooli 写了::for i in `seq 100`;do echo "$i"; sleep 0.1;done |zenity --progress --title "111" --text "22222" --percentage=0 --auto-close --width=500
这样是可以的,你中间那个echo为何要弄成那样啊,又看不见?
不是我要把中间弄成那样啊,我前面那个for循环是模拟另一个程序的输出的啊.
其实就是 mencoder,输出的是类似这样的:
Pos: 3.6s 90f ( ??%) 0.00fps Trem: 0min 0mb A-V:0.023 [65:85]
我要把 ?? 取出来,给 zenity 用.
z
这样是可以的:
代码: 全选
for i in `seq 100`;do echo "xxx (" $i"%) yyy"; sleep 0.1;done |while read line;do echo $line |sed 's/^.*( //;s/%.*$//';done |zenity --progress --title "111"
-
bones7456
- 帖子: 8495
- 注册时间: 2006-04-12 20:05
- 来自: 杭州
-
联系:
#9
帖子
由 bones7456 » 2008-08-12 12:04
xiooli 写了:bones7456 写了:xiooli 写了::for i in `seq 100`;do echo "$i"; sleep 0.1;done |zenity --progress --title "111" --text "22222" --percentage=0 --auto-close --width=500
这样是可以的,你中间那个echo为何要弄成那样啊,又看不见?
不是我要把中间弄成那样啊,我前面那个for循环是模拟另一个程序的输出的啊.
其实就是 mencoder,输出的是类似这样的:
Pos: 3.6s 90f ( ??%) 0.00fps Trem: 0min 0mb A-V:0.023 [65:85]
我要把 ?? 取出来,给 zenity 用.
z
这样是可以的:
代码: 全选
for i in `seq 100`;do echo "xxx (" $i"%) yyy"; sleep 0.1;done |while read line;do echo $line |sed 's/^.*( //;s/%.*$//';done |zenity --progress --title "111"
高手啊~问题解决~
只是,管道的这个特性还是不知道原因,呵呵...
-
HuntXu
- 帖子: 5776
- 注册时间: 2007-09-29 3:09
#10
帖子
由 HuntXu » 2008-08-12 12:08
最后还是用sed...
HUNT Unfortunately No Talent...
-
BigSnake.NET
- 帖子: 12522
- 注册时间: 2006-07-02 11:16
- 来自: 廣州
-
联系:
#11
帖子
由 BigSnake.NET » 2008-08-12 12:09
HuntXu 写了:
最后还是用sed...
关键不在于sed
而是使那堆管道每个只处理一行
for i in `seq 10`;do echo "xxx (" $i"%) yyy"; sleep 0.1;done | while read i ; do echo $i | cut -d " " -f 3 | cut -d "%" -f 1 ; done
^_^ ~~~
要理解递归,首先要理解递归。
地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
-
HuntXu
- 帖子: 5776
- 注册时间: 2007-09-29 3:09
#12
帖子
由 HuntXu » 2008-08-12 12:16
没理解我的意思...我是先看到用gawk的,感叹一下不能轻易用牛刀而已...
HUNT Unfortunately No Talent...
-
bones7456
- 帖子: 8495
- 注册时间: 2006-04-12 20:05
- 来自: 杭州
-
联系:
#13
帖子
由 bones7456 » 2008-08-12 13:11
哈哈,这样了以后,cut sed gawk mawk 都可以了...