【问题标题】:Grep files matching result of grep from a filegrep 文件匹配文件中 grep 的结果
【发布时间】:2015-04-07 22:09:47
【问题描述】:

我想做以下事情,但今天我似乎无法将它包裹起来......

我有一个部门编号,例如 45。我有一个以员工部门编号结尾的员工数据文件。所以,我可以抓住所有员工:

grep ",45$" /data/employees.dat

现在,它返回如下内容。为简洁起见,我省略了多列数据。第一列是 ID。最后是节号。

38275,...some data...,45
4718573,...some data...,45
328,...some data...,45

现在,进入最困难的部分... /data 中有一组目录。每个目录都命名为 p####,其中 #### 是员工编号。在这些目录中是一组文件。我对 /data/p####/contacts.csv 感兴趣。我有一个键值(本例中为“Bob”),我想在contacts.csv 文件中为前一个grep 的每个员工找到包含键值的每一行。我不想手动执行此操作,因为在实际工作中,每个 grep 都会收到几千个结果。

grep Bob /data/p38275/contacts.csv
grep Bob /data/p4718573/contacts.csv
grep Bob /data/p328/contacts.csv

在我看来,我应该能够对文件名的模式进行 grep,但随后我必须将第一个 grep 作为模式 - 我认为我做不到。如果唯一好的解决方案是编写一个脚本来手动完成这一切,我会这样做。现在,我正在搞乱 sed 和 awk 看看是否有什么开始有意义。

【问题讨论】:

    标签: awk sed grep cut


    【解决方案1】:

    我会说

    grep Bob $(awk -F, '$NF == 45 { print "/data/p" $1 "/contacts.csv" }' /data/employees.txt)
    

    或者可能

    grep -h Bob $(awk -F, '$NF == 45 { print "/data/p" $1 "/contacts.csv" }' /data/employees.txt)
    

    如果您不希望将 Bob 所在的文件名作为输出的一部分。

    它的工作方式是这样的

    awk -F, '$NF == 45 { print "/data/p" $1 "/contacts.csv" }' /data/employees.txt
    

    打印文件名列表(由第一个字段和字符串常量构建,其中最后一个字段是45),然后将其作为参数传递给grep(这就是$() 命令替换的用途)。 请注意,这预计字段中没有空格,尽管鉴于示例输入数据,我无法想象会有。

    【讨论】:

    • 这是正确的,但缺少一半的答案。您必须将原始 grep 输入到上面的答案中,如:grep ",45$" /data/employees.dat | grep Bob $(awk -F, '$NF == 45 { print "/data/p" $1 "/contacts.csv" }')
    • 啊。不,我只是忘记了 awk 命令中的文件名——它已经在选择了。我在其中编辑了它;我的错。