相关疑难解决方法(0)

如何诱使命令认为其输出将发送到终端

给定一个命令,当它的输出到达终端时改变其行为(例如产生彩色输出),如何在保留改变的行为的同时在管道中重定向该输出?必须有一个实用程序,我不知道。

某些命令(例如grep --color=always)具有选项标志来强制执行该行为,但问题是如何解决仅依赖于测试其输出文件描述符的程序。

如果重要的话,我的 shellbash在 Linux 上。

shell pipe utilities stdout pty

55
推荐指数
6
解决办法
1万
查看次数

为什么用颜色 grepping 不返回任何东西?

我有以下foo.txt文件:

This is the first line.
This is the middle line.
This is the last line.
Run Code Online (Sandbox Code Playgroud)

而且我正在尝试仅通过单词 grep 中间行middle并返回周围环境(例如),因此我可以突出显示整个句子(这在与上下文选项一起使用时特别有用)。

确实可以在没有颜色的情况下工作:

$ grep -o --color=none '.\+ middle .\+' foo.txt
This is the middle line.
Run Code Online (Sandbox Code Playgroud)

但相同的命令不适用于颜色:

$ grep -o --color=auto '.\+ middle .\+' foo.txt
(empty line)
Run Code Online (Sandbox Code Playgroud)

注意:没有-o它没有任何区别。

虽然它仅在过滤行的前半部分时有效:

$ grep -o --color=auto '.\+ middle' foo.txt
This is the middle
Run Code Online (Sandbox Code Playgroud)

但不是下半场 ( 'middle .\+')。

为什么这不能按预期工作,我该如何解决?这是一个错误还是由于某种原因我不能同时使用两个正则表达式?


在 OS X 上测试:

$ grep --version …
Run Code Online (Sandbox Code Playgroud)

command-line osx grep bsd

7
推荐指数
1
解决办法
3458
查看次数

Shell - 根据模式自定义日志文件每一行的颜色

我想使用 wim、less 或其他方式更改显示大(约 6000 行)日志文件的方式,以简化问题检查。

我想强调一些行对数的基础上图案(即errorwarninginfo...)和/或隐藏一些人。

我可以使用哪些工具?我只需要一个shell脚本吗?重要的是,在这个过程之后,我可以使用less、vim、...读取输出来执行搜索操作!

编辑:日志的一小部分:

2016/10/25 12:19:24.403355 INFO <ServiceManager.cpp#2614 TID#3> Security object has NOT been parsed
2016/10/25 12:19:24.403369 INFO <ServiceManager.cpp#1263 TID#3> Service object sequence started
2016/10/25 12:19:24.403372 DBG <ServiceManager.cpp#1276 TID#3> preinvoke succeeded
Run Code Online (Sandbox Code Playgroud)

colors text-processing syntax-highlighting

5
推荐指数
2
解决办法
7199
查看次数

grep --color=auto 在 ^M 处于彩色匹配中时中断

我有 2 个类似的文件(dos.txt 和 unix.txt),其中的文本The quick brown fox jumps\n over the lazy dog.因行尾而异。当我在行尾搜索单词时,dos.txt 的输出为空:

$ grep -E 'jumps^M?$' dos.txt unix.txt

unix.txt:The quick brown fox jumps
Run Code Online (Sandbox Code Playgroud)

Grep 找到了一些东西,但没有打印出来。grep 的实际输出如下所示:

$ grep -E --color=always 'jumps^M?$' dos.txt unix.txt | cat -v
^[[35m^[[Kdos.txt^[[m^[[K^[[36m^[[K:^[[m^[[KThe ... ^[[01;31m^[[Kjumps^M^[[m^[[K
^[[35m^[[Kunix.txt^[[m^[[K^[[36m^[[K:^[[m^[[KThe ... ^[[01;31m^[[Kjumps^[[m^[[K
Run Code Online (Sandbox Code Playgroud)

所以看起来唯一的区别是 ^M 在彩色输出里面,它会导致整行消失。我该如何解决这个问题(不使用 dos2unix 或类似工具转换 dos 文件)?

grep colors

5
推荐指数
1
解决办法
983
查看次数

什么使用 TERM 变量?

根据这份文件

环境变量 TERM 包含文本窗口功能的标识符。您可以通过使用“infocmp”命令并使用“man 5 terminfo”作为参考来获得这些能力的详细列表。

但是TERM变量实际上是如何使用的呢?比如说,系统运行xterm(X Window 系统的终端模拟器)。是否xterm使用TERM变量,或者是它的壳呢?如果是这样,如何?将xterm停止工作,如果TERM设置为linux

另外,为什么不着色输出禁用如果我改变TERM其默认值的xterm-256color别的东西一样xterm

terminal xterm

4
推荐指数
1
解决办法
2829
查看次数

dc 打印如何拆分长号

运行该dc实用程序时,如果我输入了一个非常大的数字,请说:

99999999999999999999999999999999999999999999999999999999999999

当我使用 打印出来时p,我得到:

999999999999999999999999999999999999999999999999999999999999999999999\
999
Run Code Online (Sandbox Code Playgroud)

为什么它在 69 位后拆分输出?

dc

2
推荐指数
2
解决办法
270
查看次数

在终端中显示转义序列?

有没有办法让终端显示原始转义序列?(例如用于控制颜色的那些)

我遇到了这个 UNIX.SE 问题,想过滤“红色”输出(按颜色过滤命令的输出

但是,答案中的命令不适用于我的输出(例如git status“未跟踪的文件”中的红色)。他们确实为那里的例子工作echo -e '\033[00;31mtest\033[00m' | grep --color=none '[[:cntrl:]]'。过滤grep --color=none '[[:cntrl:]]'适用于我的输出,但也显示具有其他颜色的文本。

我想我看到的红色一定是与 不同的红色\e[31m

有没有办法让终端输出原始转义序列?(这样我就可以使用正确的顺序来过滤我看到的特定红色)

(bash,Ubuntu 18.04)

- 更新 -

为了澄清起见,我的问题是如何显示原始转义序列。

@egmont' 使用script有效的答案。基本上,我只需要用来script记录输出并使用上述问题的答案之一来查找红色文本,例如:

script /tmp/a.txt
git status
exit
cat /tmp/a.txt | grep -Eo $'\e\\[31m[^\e]*\e\\[[03]?m'
Run Code Online (Sandbox Code Playgroud)

其他答案/评论也正确指出我的用法git没有通过管道获得颜色。

terminal

2
推荐指数
2
解决办法
1112
查看次数