代码之家  ›  专栏  ›  技术社区  ›  Sam

在Bash中使用cat和grep命令

  •  1
  • Sam  · 技术社区  · 7 年前

    我在尝试实现此bash命令时遇到问题:

    连接当前目录中至少出现一个单词的所有文本文件 BOB (在任何情况下)在文件文本内。

    我这样做对吗?使用 cat 命令,然后使用 grep 查找单词的出现位置 鲍勃 ?

    cat grep -i [BOB] *.txt > catFile.txt
    
    5 回复  |  直到 7 年前
        1
  •  6
  •   John1024 David C. Rankin    7 年前

    要正确处理带有空格字符的文件名,请执行以下操作:

    grep --null -l -i "BOB" *.txt | xargs -0 cat > catFile.txt
    
        2
  •  2
  •   New Alexandria    7 年前

    你的问题是需要通过 grep 的文件名 cat 作为内联函数:

    cat $(grep --null -l -i "BOB" *.txt ) > catFile.txt
    
    • $(.....) 处理内联执行
    • -l 仅返回匹配内容的文件名
        3
  •  2
  •   Benjamin W.    5 年前

    你可以使用 find 具有 -exec :

    find -maxdepth 1 -name '*.txt' -exec grep -qi 'bob' {} \; \
        -exec cat {} + > catFile.txt
    
    • -maxdepth 1 确保搜索深度不超过当前目录
    • -name '*.txt' 表示查看以结尾的所有文件 .txt –如果还有 目录 结束于 .txt文件 ,您可以添加 -type f 仅查看文件
    • -exec grep -qi 'bob' {} \; 为每个运行grep .txt文件 找到文件。如果 bob 在文件中,退出状态为零,执行下一个指令。 -q 确保grep处于静默状态。
    • -exec cat {} + cat 在所有包含 上下快速移动
        4
  •  0
  •   Benjamin W.    7 年前

    您需要删除方括号。。。

    grep -il "BOB" *
    
        5
  •  0
  •   Allan    7 年前

    您还可以使用以下命令,必须从包含 BOB 文件夹。

    grep -il BOB *.in | xargs cat > BOB_concat.out
    
    • -i 是用于设置 grep 在里面 case insensitive mode
    • -l 将仅用于输出包含作为grep参数提供的模式的文件名
    • *.in 用于查找目录中的所有输入文件(应根据文件夹内容进行调整)
    • 然后将命令的结果通过管道传输到 xargs 以构建cat用于生成文件串联的参数。

    假设:

    • 您的文件夹只包含名称中没有奇怪字符的文件(例如空格)