【问题标题】:Using cat and grep commands in Bash在 Bash 中使用 cat 和 grep 命令
【发布时间】:2018-05-31 07:20:44
【问题描述】:

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

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

使用cat 命令然后使用grep 查找单词BOB 的出现对我来说是否正确?

cat grep -i [BOB] *.txt > catFile.txt

【问题讨论】:

  • 正则表达式[BOB] 匹配一个可以是BO 的单个字符(方括号内的重复项将被忽略)。在不加引号的情况下,如果您有任何与模式匹配的文件名,shell 将根据稍微不同的规则(glob 模式,而不是正则表达式)将 [BOB] 替换为匹配文件名的列表。
  • cat grep 不运行两个命令;它使用参数grep 运行cat(这将是一个错误,除非当前目录中有一个名为grep 的文件与cat 的其他参数连接)。

标签: bash shell grep cat


【解决方案1】:

您可以将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' {} \; 为找到的每个 .txt 文件运行 grep。如果bob 在文件中,则退出状态为零并执行下一个指令。 -q 确保 grep 是静默的。
  • -exec cat {} + 在所有包含 bob 的文件上运行 cat

【讨论】:

    【解决方案2】:

    您还可以使用以下命令,您必须从包含 BOB 文件的目录运行该命令。

    grep -il BOB *.in | xargs cat > BOB_concat.out
    
    • -i 是用于在case insensitive mode 中设置grep 的选项
    • -l 将用于仅输出包含作为参数提供给 grep 的模式的文件名
    • *.in用于查找dir中所有的输入文件(要适应你的文件夹内容)
    • 然后将命令的结果通过管道传送到xargs,以构建cat 将用于生成文件连接的参数。

    假设:

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

    【讨论】:

      【解决方案3】:

      你需要去掉方括号...

      grep -il "BOB" *
      

      【讨论】:

      • 这不是唯一的问题。您可能想要扩展如何将catgrep 结合起来的问题。
      【解决方案4】:

      您的问题是需要将grep 的文件名作为内联函数传递给cat

      cat $(grep --null -l -i "BOB" *.txt ) > catFile.txt
      
      • $(.....) 处理内联执行
      • -l 仅返回匹配项的文件名

      【讨论】:

      • 这很好,除非文件名包含空格或其他 shell 活动字符。更可靠的方法是使用 grep --nullxargs --null
      • $(some bash command) 将在行的处理中到达时执行此代码。因此,在这里它将获取所有出现在括号内的输出,并将其传递给cat,之后其输出将直接使用>
      【解决方案5】:

      正确处理带有空白字符的文件名:

      grep --null -l -i "BOB" *.txt | xargs -0 cat > catFile.txt
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-04
        • 2023-02-06
        • 2014-06-11
        • 1970-01-01
        • 1970-01-01
        • 2012-10-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多