【问题标题】:OSX bash scriptingOSX bash 脚本
【发布时间】:2014-06-16 03:32:31
【问题描述】:

我不做太多的 shell 脚本,但我想基本上这样做:

  1. 运行命令“grunt check”大约 30 次(该过程需要 60 秒)。
  2. 对该命令的输出执行“一些随机错误消息。失败”的正则表达式。 “失败”是我正在搜索的内容,但我想捕捉整个句子。
  3. 将关联的行写入文件。

    #!/bin/bash

     COUNTER=0
     while [  $COUNTER -lt 30 ]; do
         command grunt check
         // ERROR = regex(/\/Failed./)
         // WRITE ERROR TO FILE
         let COUNTER=COUNTER+1 
     done
    

【问题讨论】:

    标签: regex macos bash shell


    【解决方案1】:
    for ((cr=0; cr<30; cr++))
    do
       grunt check | grep Failed
    done > outfile.txt
    

    【讨论】:

      【解决方案2】:
      counter=0
      while [  $counter -lt 30 ]; do
          grunt check | grep Failed
          let counter=counter+1 
      done > some file
      

      上面使用管道捕获grunt命令的输出并将其发送到grepgrep 搜索输出并打印包含单词Failed 的所有行。然后将任何此类行发送到名为 somefile 的文件。

      作为一个小问题,我已将 COUNTER 转换为小写。这是因为系统使用大写环境变量。如果您习惯使用小写字母,那么您就不会意外覆盖小写字母。 (在这种特殊情况下,没有名为 COUNTER 的系统变量,所以你是安全的。)

      另一种计数到30的方法:

      您可能会发现这更简单:

      for counter in {1..30}; do
          grunt check | grep Failed
      done > somefile
      

      {1..30} 表示法提供从一到三十的数字。这是一个 bash 功能,所以不要尝试在简单的 POSIX shell 上使用它。

      获取更多上下文

      如果您想查看有关错误消息的更多上下文,grep 提供了几个帮助选项。要查看匹配“失败”的行和之前的行,请使用-B

      for counter in {1..30}; do
          grunt check | grep -B 1 Failed
      done >somefile
      

      同样,-A 可用于显示匹配后的行。 -C 将显示匹配前后的行数。

      【讨论】:

      • 当 OP 使用 0-29 时使用 1-30 似乎很奇怪,尽管这并不重要。
      • @StevenPenny 是的,计算机科学家确实喜欢从零开始计数。因此,根据您的喜好,{1..30} 可以替换为 {0..29}
      • 不,不要在我的帐户上更改它
      • 在 grep 之后添加-B 1grunt check | grep -B 1 Failed &gt;somefile
      • @Jeff 添加-E 选项以获得扩展的正则表达式:grunt check | grep -EB 1 'Failed|Done|Aborted'
      猜你喜欢
      • 2017-05-28
      • 2014-09-05
      • 2017-08-16
      • 1970-01-01
      • 2012-04-11
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多