如何将额外值连接到一个命令的输出并将其传递给另一个Unix命令

时间:2014-01-09 06:14:26

标签: linux bash unix grep xargs

我有这个命令

grep 'Some pattern' location/*filename* | cut -d ' ' -f2 | cut -d '}' -f2 |
grep -v '^$' | head -1

上面的命令将输出作为一些文件名,例如:

abc.txt

现在我想从这个文件abc.txt中找到另一行并匹配一些特定的模式,所以我这样做了

grep 'some pattern' location/*filename* | grep -iv .tar | grep -v backup |
grep -v bkp | cut -d ' ' -f2 | cut -d '}' -f2 | head -1 | xargs grep 'some pattern'

它无效,因为我当前目录中没有abc.txt文件。

在将abc.txt命令传递给xargs grep之前,有人可以告诉我如何将位置路径附加到{{1}}吗?

5 个答案:

答案 0 :(得分:0)

你可以试试这个,

grep 'some pattern' location/*filename* | grep -iv .tar | grep -v backup |
grep -v bkp | cut -d ' ' -f2 | cut -d '}' -f2 | head -1 | xargs |
sed 's#.*#/path/to/dir/&#g' | xargs grep 'some pattern'

答案 1 :(得分:0)

如果cmd生成输出“bar”,但您需要“foobar”,则可以执行以下操作:

printf foo; cmd

在您的情况下,如果您想在输出中添加/p/a/t/h,请执行以下操作:

{ printf /p/a/t/h/; grep 'some pattern' filename | ... | head -1; } | xargs ...

但您最好只用head -1替换sed -e 1s@^@/p/a/t/h/@ -e 1q

答案 2 :(得分:0)

从表面上看,如果第一个命令序列为您提供某个目录中文件的名称,则需要使用find来获取该文件的路径名:

find . -type f -name $(grep 'Some pattern' location/*filename* | cut -d ' ' -f2 |
                       cut -d '}' -f2 | grep -v '^$' | head -1) \
     -exec grep 'some pattern' {} +

在第一行之后你不需要反斜杠(虽然它不会造成伤害);你需要在第二行之后使用反斜杠。您可以为搜索指定与.不同的起点。

答案 3 :(得分:0)

大家好,感谢您的建议..我也找到了解决问题的方法..

FYI

这是我用的......

echo "dev/temp/text/"$(grep 'Some pattern' location/*filename* | cut -d ' ' -f2 | cut -d '}' -f2 | grep -v '^$' | head -1) | xarg grep 'some pattern'

答案 4 :(得分:0)

一些想法:

... | head -1 | sed 's,^,location/,' | xargs grep 'some pattern'

... | head -1 | xargs -I FILE grep 'some pattern' location/FILE