我有一些测试输出,看起来像
PASS: tests/test_mutex_rmw
PASS: tests/test_mutex_trylock
PASS: tests/test_malloc_irreg
FAIL: tests/ARMCI_PutS_latency
FAIL: tests/ARMCI_AccS_latency
PASS: tests/test_groups
PASS: tests/test_group_split
PASS: tests/test_malloc_group
FAIL: tests/test_accs
FAIL: tests/test_accs_dla
我想过滤输出以仅查看失败。只需从屏幕复制文本并粘贴到 stdin 中以传递到 grep 会很方便,例如
grep FAIL
和 Shift-Ctrl-V(或鼠标中键)复制文本。
我想看到的只是
FAIL: tests/ARMCI_PutS_latency
FAIL: tests/ARMCI_AccS_latency
FAIL: tests/test_accs
FAIL: tests/test_accs_dla
但相反,粘贴的输入会显示在屏幕上,并且由于缓冲,输入会与最终输出混合:
$ grep FAIL
PASS: tests/test_mutex_rmw
PASS: tests/test_mutex_trylock
PASS: tests/test_malloc_irreg
FAIL: tests/ARMCI_PutS_latency
FAIL: tests/ARMCI_AccS_latency
PASS: tests/test_groups
PASS: tests/test_group_split
PASS: tests/test_malloc_group
FAIL: teFAIL: tests/ARMCI_PutS_latency
sts/test_accs
FAIL: tests/test_accs_dla
FAIL: tests/ARMCI_AccS_latency
FAIL: tests/test_accs
FAIL: tests/test_accs_dla
对我来说,首先将输入提供给 cat 然后传递给 grep, 是有意义的cat | grep FAIL
,但这实际上并没有帮助。缓冲区混合仍然发生。
当然,如果将数据放在传递给 grep 的文件中,则可以干净地过滤它。但我正在寻找的是一个方便的工具,可以简单地对通过剪贴板缓冲区从终端输出复制的文本进行轻度过滤。怎样做最好呢?
同样,如何在不回显到屏幕的情况下完成粘贴(以静默方式提供数据作为命令的标准输入)?
一种方法是显式关闭回显,
stty -echo; grep FAIL; stty echo
这确实有效,但我怀疑有一些方法可以在不切换 stty 的情况下做到这一点。您知道其他基于 shell 的方法吗?
我使用 bash(在 Debian GNU/Linux 上),但 POSIX shell 解决方案也很有趣。
答案1
用鼠标标记文本,然后使用xclip
:
xclip -o | grep FAIL
或从剪贴板复制(Ctrl-c):
xclip -selection clipboard -o | grep FAIL
或者:
xclip -sel c -o | grep FAIL
简而言之。
答案2
如果您使用的是 Bournebash
或任何其他类似 Bourne 的 shell,则可以使用here-document
。以开始命令grep FAIL << 'EOF'
并按 Enter。 Bash 将用一个>
符号进行提示,以表明需要从终端输入更多命令。然后粘贴您的输入,并EOF
在一行中单独输入。的输出grep
将出现在该EOF
行之后。
$ grep FAIL << 'EOF'
> PASS: tests/test_mutex_rmw
PASS: tests/test_mutex_trylock
PASS: tests/test_malloc_irreg
FAIL: tests/ARMCI_PutS_latency
FAIL: tests/ARMCI_AccS_latency
PASS: tests/test_groups
PASS: tests/test_group_split
PASS: tests/test_malloc_group
FAIL: tests/test_accs
FAIL: tests/test_accs_dla
EOF
FAIL: tests/ARMCI_PutS_latency
FAIL: tests/ARMCI_AccS_latency
FAIL: tests/test_accs
FAIL: tests/test_accs_dla
确保使用EOF
任何引用运算符引用 (或其任何部分),以确保此处文档内不会执行参数扩展、命令替换或算术扩展,并且\
字符不会被破坏。
为了尽量减少击键次数,您可以这样做:
grep FAIL<<\.
<paste-text-here>
.
答案3
你可以用它sponge
来吸收所有的标准输入在将其写入之前标准输出。 (在 Debian 上它位于 package 中moreutils
。)
grep FAIL | sponge
或者
sponge | grep FAIL
如果你没有,sponge
你可以使用 POSIX 代码实现一个简单的近似,如下所示
#!/bin/sh
[ -n "$1" ] && exec 1>"$1"
umask 077
tmp="${TMPDIR:-/tmp}/${0##*/}.$$.tmp"
cat >"$tmp"
cat "$tmp"
rm -f "$tmp"
你提到你真的很想sponge
拥有“不回显标准输入的选项“它没有回声标准输入。您所看到的是终端驱动程序的功能,保留为默认回显键入的文本。我倾向于使用这样的函数
esponge() {
local g ss
if [ -t 0 ]
then
g=$(stty -g)
stty -echoe
fi
sponge "$@"
ss=$?
[ -n "$g" ] && stty "$g"
return $ss
}
esponge | grep FAIL
另一种替代方案但等效于sponge
通过发送输入tac
(不是 POSIX,但可能安装在某些没有 POSIX 的系统上sponge
)
tac | tac | grep FAIL
或者将每个实例替换tac
为其中之一这些 POSIX 替代品
答案4
简单地通过 echo 管道传输粘贴的文本有什么问题?至少对于像你这样的简单文本来说效果很好。唯一要记住的是引用这些行。因此,您可以编写echo "
、粘贴文本、关闭引用并根据需要通过管道传输。 (这假设,就像在您的示例中一样,echo
不会损坏您的文本。控制字符等可能会导致回显出现问题。)
$ echo "PASS: tests/test_mutex_trylock
PASS: tests/test_malloc_irreg
FAIL: tests/ARMCI_PutS_latency
FAIL: tests/ARMCI_AccS_latency
PASS: tests/test_mutex_trylock
PASS: tests/test_malloc_irreg
FAIL: tests/ARMCI_PutS_latency
FAIL: tests/ARMCI_AccS_latency
PASS: tests/test_groups
PASS: tests/test_group_split
PASS: tests/test_malloc_group
FAIL: tests/test_accs
"| grep FAIL
FAIL: tests/ARMCI_PutS_latency
FAIL: tests/ARMCI_AccS_latency
FAIL: tests/ARMCI_PutS_latency
FAIL: tests/ARMCI_AccS_latency
FAIL: tests/test_accs
输入和输出明显分开。此方法仅使用最简单的 *nix 命令,对我来说比此处文档的语法更容易记住。
如果您想将文本用作命令,则可以使用 echo 作为命令替换,对于不太长的文本。
我不知道xclip,msys2好像也没有,所以我就继续用我的笨办法命令替换方法。我只是回显缓冲区内容并使其成为所需命令的命令行参数。
因为文本由多行粘贴的内容组成(但不是回显,或整个替换!)必须被引用。
因为命令替换没有被引用shell 将 echo 输出解析回单独的单词。
下面的示例当然可以更好地解决find ... -print0
(除其他外,带空格的文件名在这里不起作用),但它说明了这一点。 (无论如何,任何在路径中放置空格的人都应该受到计算机限制令。是的,比尔,我正在和你说话。)
$ ls -1 a*
a1
a2
a3
a4
a5
aa
$ ls -l $(echo "a1
a2
a3
a4
a5
aa
")
-rw-r--r-- 1 Peter None 0 Mar 11 11:59 a1
-rw-r--r-- 1 Peter None 0 Mar 11 11:59 a2
-rw-r--r-- 1 Peter None 0 Mar 11 11:59 a3
-rw-r--r-- 1 Peter None 0 Mar 11 11:59 a4
-rw-r--r-- 1 Peter None 0 Mar 11 11:59 a5
-rw-r--r-- 1 Peter None 0 Mar 11 11:58 aa