操作tee的输出以获取要写入的数据和文件名

时间:2017-06-14 12:46:00

标签: bash pipe tee

所以,我有一种情况,我正在掏出一些数据,通过其他一些东西,然后输出到一个文件。

在这个中间,我想输出到另一个文件,其中要写入的文件名和要写入的数据都在我刚刚grepped(冒号分隔)的行中指定。

文件记录采用以下格式:

<filename>:<filedata>

grep(简化了一下,因为还有一些与这个问题无关的东西)是这样的:

grep -EHv '^ *$' del_[0-9]* 2>/dev/null | sed 's/^del_//' \
                   | ([[ <condition> -eq <true> ]] && (tee --something or other --)) \
                   | cut -d: -f2 \
                   | sort -u > delcache

我想要的是附加到我有T恤的地方(即在切出第二个字段以输出到最终文件之前。

示例输入文件:

[mike]$ more del_*
::::::::::::::
del_101241_CUSTCARE
::::::::::::::
A-6000021XXX
A-6000002XXX
A-6000021XXX
A-6000021XXX
::::::::::::::
del_111231_ADRCHNG
::::::::::::::
O-7005084XXX
A-2717287XXX
::::::::::::::
del_162915_SRVR.MD
::::::::::::::
O-7811283XXX
A-3619203XXX
O-6311212XXX
A-4203831XXX
::::::::::::::
del_162975_SRVR.NP
::::::::::::::
A-3617332XXX

额外T恤声明的输出将是名为upd_ *的文件,而不是具有相同内容的del_ *(实际上,它是不同的值,用于保存与该点相匹配的文件路径,但我已经删除了一些对于简化的声明,以及tee将在此处的示例中处理的字符串,对于上面列表中的最终记录将是

162975_SRVR.NP:A-3617332XXX

那么应该将值“A-3617332XXX”附加到文件upd_162975_SRVR.NP

1 个答案:

答案 0 :(得分:0)

过滤在子流程

中完成
$ cat <<END | tee >(
    grep file1 | cut -d: -f2- >out1.txt
)
file1:data1
file2:data2
END

$ cat out1.txt
data1

有关详细信息,请参阅进程替换>(command)<(command)被视为封闭命令的文件名参数。

编辑:在评论之后,管道在这里是一个糟糕的设计,因为每个文件都必须被处理。

另一种方法。

for file in del_[0-9]*; do
    [[ -e $file ]] || continue
    grep -Ev '^ *$' "$file" | tee "upd_${file#del_}"
done |
    sort -u > delcache
删除了

-H grep选项,因为每个文件都在循环中处理

| cut -d: -f2不再需要