给定一个命令,当它的输出到达终端时改变其行为(例如产生彩色输出),如何在保留改变的行为的同时在管道中重定向该输出?必须有一个实用程序,我不知道。
某些命令(例如grep --color=always
)具有选项标志来强制执行该行为,但问题是如何解决仅依赖于测试其输出文件描述符的程序。
如果重要的话,我的 shellbash
在 Linux 上。
我有以下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) 我想使用 wim、less 或其他方式更改显示大(约 6000 行)日志文件的方式,以简化问题检查。
我想强调一些行对数的基础上图案(即error
,warning
,info
...)和/或隐藏一些人。
我可以使用哪些工具?我只需要一个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) 我有 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 文件)?
根据这份文件:
环境变量 TERM 包含文本窗口功能的标识符。您可以通过使用“infocmp”命令并使用“man 5 terminfo”作为参考来获得这些能力的详细列表。
但是TERM
变量实际上是如何使用的呢?比如说,系统运行xterm
(X Window 系统的终端模拟器)。是否xterm
使用TERM
变量,或者是它的壳呢?如果是这样,如何?将xterm
停止工作,如果TERM
设置为linux
?
另外,为什么不着色输出禁用如果我改变TERM
其默认值的xterm-256color
别的东西一样xterm
?
运行该dc
实用程序时,如果我输入了一个非常大的数字,请说:
99999999999999999999999999999999999999999999999999999999999999
当我使用 打印出来时p
,我得到:
999999999999999999999999999999999999999999999999999999999999999999999\
999
Run Code Online (Sandbox Code Playgroud)
为什么它在 69 位后拆分输出?
有没有办法让终端显示原始转义序列?(例如用于控制颜色的那些)
我遇到了这个 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
没有通过管道获得颜色。