【问题标题】:Multiple strings in for loop grep -wcfor循环中的多个字符串 grep -wc
【发布时间】:2015-01-31 15:37:20
【问题描述】:

如何添加多个字符串来搜索同一个文件:

目前:

#!/bin/bash

for log in filename.log.201[45]-*-*.gz; do
    printf '%s:' "$log"
    zcat "$log" | grep -wc 'dollar for dollars'
done

想要的结果:

#!/bin/bash

for log in filename.log.201[45]-*-*.gz; do
    printf '%s:' "$log"
    echo "count for dollar for dollars"
    zcat "$log" | grep -wc 'dollar for dollars'

    echo "count for pollar for pollars"
    zcat "$log" | grep -wc 'pollar for pollars'
done

【问题讨论】:

  • 为什么不运行您的 Desired result 脚本?

标签: bash for-loop grep


【解决方案1】:

您可以为此使用嵌套循环。

for count in 'dollar for dollars' 'pollar for pollars'; do 
 for log in filename.log.201[45]-*-*.gz; do
     printf '%s:' "$log"
     echo -n $count : 
     zcat "$log" | grep -wc "$count"
  done
done

【讨论】:

    【解决方案2】:

    使用实际的编程语言可能会更好,例如awk

    如果您想要计算每个模式出现的总次数(这可能超过每个模式出现的行数,如果一个模式在一行中出现多次),您可以使用grep 的-o 选项输出实际匹配,然后使用sort | uniq -c 构造最终报告,它计算输出流中每个唯一行的出现次数。这使您可以使用 -e 选项为单个 grep 命令提供多种模式:

    for log in filename.log.201[45]-*-*.gz; do
      zcat "$log" |
      grep -e "pattern 1" -e "pattern 2" -ow |
      sort | uniq -c |
      xargs -d\\n printf "${log//%/%%}:%s\n"
    done
    

    【讨论】:

      猜你喜欢
      • 2014-05-21
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-22
      • 2021-03-22
      • 1970-01-01
      相关资源
      最近更新 更多