免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 679 | 回复: 5

[文本处理] expect脚本能接受管道传递的参数吗? [复制链接]

论坛徽章:
0
发表于 2018-09-22 19:32 |显示全部楼层
expect脚本能接受管道传递的参数吗?
比如:
echo "v1 v2 v3" | script.exp

cat file.txt | script.exp

script.exp脚本想实现类似下面的功能:
while read v1 v2 v3
do
...
done

论坛徽章:
0
发表于 2018-09-23 15:57 |显示全部楼层
本帖最后由 FunBSD 于 2018-09-23 16:04 编辑

好吧,论坛人气真得不行了。我自己来解答吧。
为了学个expect,连tcl一块学了。

从标准输入(STDIN)、文件(File)、SHELL读取内容的脚本。
测试方法:
  1. cat file.txt | expect -d script.exp

  2. echo -e "1 2 3 4\ra b c d" | expect -d script.exp
复制代码
脚本代码:
  1. #!/usr/bin/expect -f

  2. puts "从标准输入(STDIN)读取内容"
  3. set number 0
  4. while { [gets stdin line] >= 0 } {
  5.   incr number
  6.   puts "Line $number: $line"
  7.   puts "Line $number: [lindex $line 0],[lindex $line 1],[lindex $line 2]"
  8. }
  9. puts "STDIN line number: $number"
  10. puts "--------------------------"

  11. puts "从文件(File)读取内容"
  12. set number 0
  13. set file [open ./file.txt r]
  14. while { [gets $file line] >= 0 } {
  15.   incr number
  16.   puts "Line $number: $line"
  17.   puts "Line $number: [lindex $line 0],[lindex $line 1],[lindex $line 2]"
  18. }
  19. puts "File line number: $number"
  20. puts "--------------------------"
  21. close $file

  22. puts "从文件(File)读取内容,输出时比实际多1行"
  23. set number 0
  24. set file [open ./file.txt r]
  25. foreach line [ split [read $file] "\n" ] {
  26.   incr number
  27.   puts "Line $number: $line"
  28.   puts "Line $number: [lindex $line 0],[lindex $line 1],[lindex $line 2]"
  29.   foreach word [ regexp -all -inline {\S+} $line ] {
  30.     puts "$word"
  31.   }
  32. }
  33. puts "File line number: $number"
  34. puts "--------------------------"
  35. close $file

  36. puts "从文件(File)读取内容,输出时比实际多1行"
  37. set file [open ./file.txt r]
  38. while { ![eof $file] } {
  39.   set buffer [read $file 100000]
  40.   puts "$buffer"
  41. }
  42. puts "--------------------------"
  43. close $file

  44. #puts "从相同后缀的文件读取内容"
  45. #foreach filename [glob *.txt] {
  46. #  set file [open $filenamel
  47. #  #...
  48. #  close $file
  49. #}

  50. #puts "从SHELL读取内容"
  51. #set file [open {| find ./ -type f | xargs grep "content"} r]
  52. #set file [open "| find ./ -type f | xargs grep \"content\"" r]

复制代码



论坛徽章:
0
发表于 2018-09-23 16:12 |显示全部楼层
补充:

line切分成word:
foreach word $line { ... }    #不能有特殊字符
foreach word [ lrange $line 0 end ] { ... }    #不能有特殊字符
foreach word [ lsearch -inline -all $line * ] { ... }    #不能有特殊字符
foreach word [ regexp -all -inline {\S+} $line ] { ... }    #可以有持特殊字符

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
发表于 2018-09-23 20:01 |显示全部楼层
建议试试 expect_user

论坛徽章:
0
发表于 2018-09-24 08:23 |显示全部楼层
回复 4# waker

给个例子,谢谢。

论坛徽章:
0
发表于 2018-09-24 08:44 |显示全部楼层
找到方法。
  1. #!/usr/bin/expect -f

  2. send_user "Input Line: "
  3. expect_user -re "(.*)\n"
  4. set value $expect_out(1,string)
  5. puts "$value\r"
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

数据风云,十年变迁
DTCC 第十届中国数据库技术大会已启航!

2019年5月8日~5月10日,由IT168旗下ITPUB企业社区平台主办的第十届中国数据库技术大会(DTCC2019),将在北京隆重召开。大会将邀请百余位行业专家,就热点技术话题进行分享,是广大数据领域从业人士的又一次年度盛会和交流平台。与SACC2018类似,本届大会将采用“3+2”模式:3天传统技术演讲+2天深度主题培训。大会不仅提供超100场的主题演讲,还会提供连续2天的深度课程培训,深化数据领域的项目落地实践方案。
DTCC2019,一场值得期待的数据技术盛会,殷切地希望您报名参与!

活动入口>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP