【问题标题】:Searching within txt files using bash使用 bash 在 txt 文件中搜索
【发布时间】:2016-04-26 18:30:10
【问题描述】:

我正在寻找琐碎任务的琐碎解决方案。

我的 bash 脚本正在循环几个文件夹,在其中生成一些 log.txt 文件。如果每种情况下的某些操作已在每个日志中成功执行,则带有句子“单位正常”的字符串应该出现在 log.txt 中的某处,但是它在每个 log.txt 中的实际位置(精确的字符串数)是不同的!

我需要在我的循环中添加一些条件(可能使用 IF )来检查该句子是否确实存在于日志文件中的某处,如果是,则在执行我的脚本的终端中打印“一切正常”特定文件夹循环的时刻,否则(如果日志中没有字符串)打印“坏消息”之类的东西!

将感谢不同的解决方案,尤其是如何在给定的日志文件中查找所选短语的字符串。

谢谢!!

格莱布

【问题讨论】:

    标签: bash loops if-statement text


    【解决方案1】:

    要将测试应用于整个目录,可以使用简单的for 循环。如果您需要递归处理目录,您可以将find 的结果提供给while read -r... 循环。在任何一种情况下,搜索都是相似的。这是一个搜索单个日志文件目录的示例:

    $ for i in dirname/*; do grep -q 'The unit is OK' "$i" && \
    echo "$i - Everything is OK" || echo "$i - Bad news"; done
    

    搜索dirname 是我的测试dat 目录的位置,示例结果为:

    dat/test.properties - Bad news
    dat/test_pph_s.txt - Bad news
    dat/testlog-1.txt - Everything is OK
    dat/testlog-2.txt - Everything is OK
    dat/testlog-3.txt - Everything is OK
    

    testlog-X.txt 文件包含的位置,例如:

    $ cat dat/testlog-1.txt
    The unit is OK
    

    【讨论】:

      【解决方案2】:

      如果没有更多信息(您正在寻找的字符串示例、潜在文件名、您已有的任何 bash 脚本),就很难提供具体建议。

      不过,如果您有一组已知的潜在字符串,您可以在循环时检查它们是否存在于文件中

      if [ `grep -E (pattern1|pattern2|pattern3) $FILE | wc -l` -gt 0 ]; then
          # String was found in file
      fi
      

      【讨论】:

      • 你可以使用grep -q:if grep -qE '(pattern1|pattern2|pattern3)' "$FILE"; then
      • $FILE 周围缺少双引号。反引号 (`) 用于旧式命令替换,例如foo=`command`。建议使用 foo=$(command) 语法。 $() 内的反斜杠处理不那么令人惊讶,$() 更容易嵌套。见mywiki.wooledge.org/BashFAQ/082。此外 - 无用使用wc -l 和命令[。相反 - 询问grep 的退出状态,就像上面评论中显示的@andlrc 一样。
      【解决方案3】:

      使用某种模式扫描文件(例如:log.txt)

      for file in $(find /path/to/logs -name "log.txt")
      do
        grep -q "The unit is OK" $file && echo "$file: Everything is OK" || echo "$file: Bad news"
      done
      

      【讨论】:

      • 永远不要这样做:for x in $(command)$varfor-in 用于迭代参数,而不是(输出)字符串。相反,请使用 glob(例如 *.txt)、数组(例如 "${names[@]}")或 while-read 循环(例如 while read -r line)。见Bash Pitfalls 1Don't read lines with for
      猜你喜欢
      • 1970-01-01
      • 2017-08-15
      • 2019-02-13
      • 2019-08-27
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 2017-04-13
      相关资源
      最近更新 更多