在查找和处理管道

时间:2017-02-13 18:17:39

标签: linux bash shell

我有一组json文件,我想对它们执行一些操作(提取标记)。命令如下所示:

find ./fixtures/*.json | xargs cat | jq .[0].terms.customer[0].slug

.[0].terms.customer[0].slug是我的查询,在这里并不重要。上面的命令工作正常。输出类似于:

"default"
"default"
"default"
"default"
"foo"
"foo"
"bar"

但是如何更改上面的shell命令以显示已处理文件的文件名?我希望看到这样的输出:

1.json: "default"
2.json: "default"
3.json: "default"
4.json: "default"
5.json: "foo"
6.json: "foo"
7.json: "bar"

尝试使用echo,但似乎输出被重定向到管道。我应该回应stderr或更好的方法吗?

当我对tee使用find ./fixtures/*.json | tee /dev/tty | xargs cat | jq .[0].terms.customer[0].slug命令时,它会向我显示:

1.json
2.json
3.json
4.json
5.json
6.json
"default"
"default"
"default"
"default"
"foo"
"foo"
"bar"

这不容易阅读。

2 个答案:

答案 0 :(得分:2)

您可以在sed命令中使用xargs,如下所示:

find fixtures -name '*.json' -print0 | 
xargs -0 -I % bash -c 'sed "s~^~$1: ~" < <(jq ".[0].terms.customer[0].slug" "$1")' - %

工作原理:

    建议使用
  • print0xargs -0来处理带有空格或特殊字符的文件名。
  • sed命令在jq的输出上运行,并用文件名和冒号替换每一行。
  • %之前的连字符只是bash -c命令行的占位符,它将$0填充为连字符。

答案 1 :(得分:1)

用于打印文件名和处理其内容的while循环会更好。

find ./fixtures/*.json | while read f ; do echo -n "$f: " ; cat "$f" | jq .[0].terms.customer[0].slug ; done