假设我正在执行这样的脚本:
/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
您无法选择线路。只有整个流(stdin
、stdout
、stderr
(更一般地,任何打开的文件描述符,而不仅仅是这些标准文件描述符))可以被重定向。
您可以通过管道输入命令来模拟您想要的内容,这些命令将为您整理输出行。
$ 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