排除特定线路被重定向

排除特定线路被重定向

假设我正在执行这样的脚本:

/a/b/c/script.sh >> abc.log

这意味着脚本的所有内容/执行都将被重定向到abc.log.如果我想要脚本中的特定行不是被重定向到abc.log,那么我该怎么做呢?

答案1

/a/b/c/script.sh >> abc.log

该命令意味着script.sh写入的任何输出标准输出流将被附加到abc.log

如果您希望排除匹配相似模式的一行或多行,您可以使用以下方法grep -v来完成此操作:

/a/b/c/script.sh | grep -v '<line-to-ignore>' >> abc.log

或匹配一个模式(例如所有以单词 cat 开头的行):

/a/b/c/script.sh | grep -vE '^cat' >> abc.log

grep标志-v意味着反转匹配,因此任何与您提供的模式匹配的行都将被过滤掉。

答案2

您可以使用类似的工具sed来更改 的输出script.sh,包括从流中“删除”行。如果你想逐行删除一行,你可以这样做

/a/b/c/script.sh | sed -e '5d' >> abc.log

在此示例中,将从输出中删除第五行。替换5为任意行号。

/a/b/c/script.sh | sed -e '/<regex>/d' >> abc.log

将从输出中删除与正则表达式匹配的任何行。

答案3

您无法选择线路。只有整个流(stdinstdoutstderr(更一般地,任何打开的文件描述符,而不仅仅是这些标准文件描述符))可以被重定向。

您可以通过管道输入命令来模拟您想要的内容,这些命令将为您整理输出行。

$ echo -e "hello\nworld"   |  #write hello and world; one per line
tee >(grep hello >1.log) |  #select line matching hello and write it to 1.log
grep -v hello > 2.log  #select lines NOT matching hello and write them to 2.log

答案4

如果它是脚本中的特定行/命令,您可以将其输出发送到/dev/null脚本内部。脚本内的命令如下所示:

command > /dev/null

这将导致输出丢失。如果您希望它出现在控制台上,您可以将其发送stderr

command 2> `tty` 1>&2

相关内容