【问题标题】:Count all lines containing a string in a directory with grep使用 grep 计算目录中包含字符串的所有行
【发布时间】:2020-07-30 04:18:52
【问题描述】:

我有一个 txt 文件,其路径被解析为 $1 和一个字符串 ($2)。 Txt 文件包含列 Dir、Dest,并且在每一行中,应将 Dir 中包含字符串 $2 的文件的多行输出到 Dest 路径。

我的想法是这样的,但是好像不行,手动调试也解决不了问题。

#!/bin/bash
if [ -f $1 ]
then
    tail -n +1 $1 | while IFS=, read -r col1 col2
    do
        if [ -d $col1]
        then
            grep -rn -c  “$2” $col1 * > $col2
        fi
    done
fi

来自终端的输入是这个

./Script_1.sh /Users/andjela/Desktop/test.txt string

输入(test.txt)文件是

Dir,Dest
/Users/andjela/Desktop/OS/dir1,/Users/andjela/Desktop/OS/rez1.txt
/Users/andjela/Desktop/OS/dir2,/Users/andjela/Desktop/OS/rez2.txt

预期文件的示例(Dest,/Users/andjela/Desktop/OS/rez1.txt)应该类似于

file1.txt: 2 (num of lines)
file2.txt: 1

【问题讨论】:

  • 能否提供“实际结果”和“预期结果”?
  • 也提供一个txt文件的样本
  • @EricBolinger 我已经编辑了问题,感谢您的通知
  • 您说“计算所有出现次数”,但您正在计算。如果您的目标字符串在一行上出现多次,它只会被计为1——您能否澄清一下,这是您想要的吗?另外,我会在您的 read 中使用更有意义的名称...read -r searchdir outfile?
  • @StephenP 是的,你是对的,行数。已编辑

标签: linux bash unix scripting grep


【解决方案1】:

我注意到关于你的脚本的几件事:

  • 在此测试中col1 后面没有空格:if [ -d $col1]
  • $2 周围有“智能引号”。 (可能是编辑器功能 太有帮助了。)
  • 使用* 匹配所有文件适用于当前目录而不是子目录。
  • online shellcheck utility 有其他一些建议。

因此,根据@stephen-p 的建议进行调整会生成以下脚本:

#!/bin/bash
if [ -f "$1" ]
then
    tail -n +2 "$1" | while IFS=, read -r searchdir outfile
    do
        if [ -d "$searchdir" ]
        then
            (cd "$searchdir" && grep -rn -c "$2" *) > "$outfile"
            # alternate:
            # grep -rn -c "$2" $searchdir/* > $outfile
        fi
    done
fi

我更喜欢交替使用 grep,因为它保留了路径。但这只是我……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-18
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 2012-05-07
    • 1970-01-01
    相关资源
    最近更新 更多