【问题标题】:How to print the file names from which I grep some lines如何打印我从中获取某些行的文件名
【发布时间】:2021-10-13 07:27:26
【问题描述】:

我正在尝试使用以下代码从几个 json 文件中获取一些行:

cat $(find ./*/*/folderA/*DTI*.json) | grep -i -E '(phaseencodingdirection|phaseencodingaxis)' > phase_direction

成功了!问题是我不知道哪一行来自哪个文件

有了这个find ./*/*/preprocessing/*DTI*.json -type f -printf "%f\n",我可以打印这些名称,但它们出现在末尾,并且与它们各自的 phaseencodingdirection|phaseencodingaxis 提取的行的顺序不同。

我不知道如何组合这些代码行来打印提取该行的文件名及其各自提取的行!?

你能帮帮我吗?

【问题讨论】:

  • grep -H 怎么样?

标签: bash terminal grep


【解决方案1】:

使用文件名作为grep 的参数,而不是cat

grep -i -H -E '(phaseencodingdirection|phaseencodingaxis)' $(find ./*/*/folderA/*DTI*.json) > phase_direction

-H 选项强制grep 在输出中包含文件名,即使只有一个文件。

但是由于您对find 的参数是文件名,而不是递归搜索的目录,因此根本不需要使用它。只需将通配符直接传递给grep。也不需要以./ 开头。任何非绝对路径名都相对于当前目录进行解释。

grep -i -H -E '(phaseencodingdirection|phaseencodingaxis)' */*/folderA/*DTI*.json > phase_direction

【讨论】:

    【解决方案2】:

    你可以使用递归grep:

    grep -iER 'phaseencodingdirection|phaseencodingaxis' --include=*DTI*.json */*/folderA
    

    【讨论】:

      【解决方案3】:

      问题是我不知道哪一行来自哪个文件

      不,你没有,因为你已经将所有文件的内容连接到一个流中。如果您希望能够在模式匹配点识别每行来自哪个文件,那么您必须首先将该信息提供给grep。比如这样:

      find ./*/*/folderA/*DTI*.json |
              xargs grep -i -E -H '(phaseencodingdirection|phaseencodingaxis)' > phase_direction
      

      xargs 程序将从其标准输入读取的行转换为指定命令的参数(在本例中为grep)。 grep-H 选项使其列出每个匹配项的文件名以及匹配行本身。

      或者,对同一事物的这种变体更简单一些,并且在某些意义上更接近原始:

      grep -i -E -H '(phaseencodingdirection|phaseencodingaxis)' \
          $(find ./*/*/folderA/*DTI*.json) > phase_direction
      

      这会将xargs 排除在外,并将命令替换直接移动到grep 的参数列表中。

      但现在请注意,如果模式 ./*/*/folderA/*DTI*.json 不匹配任何目录,那么 find 实际上并没有为您做任何有用的事情。然后没有要执行的目录递归,并且您没有指定任何测试,因此命令替换将简单地扩展到与模式匹配的所有路径,就像模式在扩展 without时所做的那样>find。因此,这可能是最好的:

      grep -i -E -H '(phaseencodingdirection|phaseencodingaxis)' \
          ./*/*/folderA/*DTI*.json > phase_direction
      

      【讨论】:

        猜你喜欢
        • 2011-09-26
        • 2018-10-21
        • 2013-02-12
        • 1970-01-01
        • 1970-01-01
        • 2016-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多