【问题标题】:grep-like tool that colors/boldens but not filter? [closed]类似grep的工具,颜色/加粗但不过滤? [关闭]
【发布时间】:2012-02-22 16:37:44
【问题描述】:

多年来,我注意到 GNU 在 Unix 中的 grep(不仅仅是 Linux 版本)检测到我正在交互使用具有颜色功能的 TERM,例如 xterm/gnome-terminal/kconsole,并且很好地在上下文中为我的搜索表达式着色。

什么可能是一个简单的 cli 工具,它只会加粗/突出显示您的 regex 或简单的搜索字符串,但与 grep 不同,它不会过滤掉任何行?也许 sed 技巧可以做到这一点,我可以将其别名并稍后通过管道传递命令?

示例

所以我编写了一个程序 pricehist.sh,它通常会为另一个程序生成类似 CSV 的数据,但我经常像这样直观地检查它:

./pricehist.sh mostalexp-GPW  28 |sort -r -g -k 3 -t ' ' |column -t -s", "
MOSTALEXP,20120222,0.78,0.79,0.76,0.77,63900,0.77    0.04000   5.00000   -0.01000  -1.25000  49203
MOSTALEXP,20120203,0.82,0.82,0.78,0.78,446089,0.78   0.04000   4.87805   0         0         347949
MOSTALEXP,20120124,0.71,0.71,0.69,0.71,61478,0.71    0.03000   4.16667   -0.01000  -1.38889  43649
MOSTALEXP,20120130,0.73,0.73,0.70,0.73,59488,0.73    0.03000   4.10959   0         0         43426
MOSTALEXP,20120210,0.79,0.81,0.77,0.81,104120,0.81   0.03000   3.75000   0.01000   1.25000   84337
MOSTALEXP,20120213,0.80,0.80,0.78,0.80,86606,0.80    0.03000   3.70370   -0.01000  -1.23457  69284
MOSTALEXP,20120126,0.69,0.75,0.69,0.72,146353,0.72   0.02000   2.81690   0.04000   5.63380   105374
MOSTALEXP,20120131,0.72,0.73,0.71,0.72,72734,0.72    0.02000   2.73973   0         0         52368
MOSTALEXP,20120123,0.72,0.73,0.71,0.72,24133,0.72    0.02000   2.73973   0         0         17375
MOSTALEXP,20120214,0.78,0.81,0.78,0.79,56990,0.79    0.02000   2.50000   0.01000   1.25000   45022
MOSTALEXP,20120209,0.79,0.82,0.79,0.80,65243,0.80    0.02000   2.46914   0.01000   1.23457   52194
MOSTALEXP,20120118,0.69,0.70,0.68,0.69,62520,0.69    0.01000   1.44928   0.01000   1.44928   43138
MOSTALEXP,20120125,0.70,0.71,0.70,0.71,92317,0.71    0.01000   1.40845   0         0         65545
MOSTALEXP,20120201,0.71,0.74,0.71,0.74,199791,0.74   0.01000   1.38889   0.02000   2.77778   147845
MOSTALEXP,20120127,0.73,0.73,0.71,0.73,38157,0.73    0.01000   1.38889   0.01000   1.38889   27854
MOSTALEXP,20120207,0.78,0.79,0.77,0.79,56243,0.79    0.01000   1.28205   0.01000   1.28205   44431
MOSTALEXP,20120206,0.78,0.80,0.77,0.78,133597,0.78   0.01000   1.28205   0.02000   2.56410   104205
MOSTALEXP,20120221,0.81,0.81,0.79,0.80,112738,0.80   0.01000   1.25000   0.01000   1.25000   90190
MOSTALEXP,20120217,0.80,0.85,0.79,0.80,272245,0.80   0.01000   1.25000   0.05000   6.25000   217796
MOSTALEXP,20120216,0.81,0.81,0.79,0.80,30814,0.80    0.01000   1.25000   0.01000   1.25000   24651
MOSTALEXP,20120113,0.66,0.66,0.65,0.65,90267,0.65    0.00500   0.76336   0.00500   0.76336   58673
MOSTALEXP,20120220,0.80,0.82,0.80,0.80,83881,0.80    0         0         0.02000   2.50000   67104
MOSTALEXP,20120215,0.80,0.82,0.79,0.80,128714,0.80   0         0         0.03000   3.79747   102971
MOSTALEXP,20120208,0.79,0.84,0.79,0.81,280446,0.81   0         0         0.05000   6.32911   227161
MOSTALEXP,20120120,0.74,0.74,0.72,0.73,128831,0.73   0         0         0.02000   2.77778   94046
MOSTALEXP,20120117,0.67,0.71,0.67,0.69,284886,0.69   0         0         0.04000   5.97015   196571
MOSTALEXP,20120116,0.65,0.67,0.65,0.67,9548,0.67     0         0         0.02000   3.07692   6397
MOSTALEXP,20120202,0.75,0.87,0.75,0.82,1270955,0.82  -0.01000  -1.35135  0.13000   17.56757  1042183
MOSTALEXP,20120119,0.70,0.74,0.70,0.72,320471,0.72   -0.01000  -1.44928  0.05000   7.24638   230739

在管道的末尾(在|column -t 之后),最好添加一些至少突出显示字符串$(date +%Y%m%d) 的内容,目前计算结果为20120222

另一个例子是tail -F /tmp/*.log | grep -C 9999 YouJustGotHacked,除了我不希望 grep 实际过滤掉任何行,只是让 YouJustGotHacked 在噪音中更容易被发现。

【问题讨论】:

  • less 可以做到这一点,但是(我不认为)您可以通过管道传输数据。听起来您有一个典型的用例。如果您发布一些示例输入和预期输出以让每个人以有用的方式思考您的问题,这可能会有所帮助。祝你好运。
  • 没错,less 的颜色很好,但我只需要它来打印带突出显示和终止,而不是等待用户交互,例如。分页或退出——然后清除其输出。除非它有一些我不知道的选项。用例:我在一个控制台中 tail -F 大量日志文件以实时查看活动

标签: regex colors sed grep term


【解决方案1】:

您可以使用egrep 并匹配您要查找的模式和行首。由于后者总是匹配,但不能着色,它模仿你所追求的。

egrep 'pattern|^' file

编辑:我最初是从this question 的回答中了解到这一点的。

【讨论】:

  • 很好找,而且比sed 方式更简单。我有一种感觉,我的问题可能与一个更老的问题重复。
  • 我在 macos 上发现 | egrep 'pattern|^' 没有突出显示模式,但 | egrep 'pattern|$' 出于某种原因会这样做(在链接的原始问题/答案中也同样提到了 zsh)
【解决方案2】:

grep 有一个-C 选项,可以在匹配行周围显示上下文。你可以利用它。

grep -C 9999 'pattern' file

【讨论】:

  • 谢谢;确实想到了,但是不喜欢使用 9999 任意大量的行(希望 stdin 在那之前很久就用完了)。还有一个问题是尽量避免为近实时输出进行缓冲
  • 在stdout中还没有遇到这个词时不输出任何东西
【解决方案3】:

您正在寻找的sed 技巧应该或多或少像这样:

sed 's/pattern/\x1b[01;31m&\x1b[0m/g' file

地点:

  • pattern 与您在 grep 中使用的相同
  • 替换模式中的& 表示使用与匹配相同的文本
  • & 周围的字符用于将前景色设置为红色并在之后重置

有关如何在sed 中转义颜色序列的更多信息,请参见question 的答案。

【讨论】:

  • 刚刚将您的单引号切换为双引号,以便 shell 将我的变量作为搜索模式:| sed "s/$(date +%Y%m%d)/\x1b[01;31m&\x1b[0m/g",这样就可以解决问题了。谢谢!
【解决方案4】:

要扩展 shellter 提到的 less 选项(如果您只是想直观地检查彩色输出而不将其传递给另一个程序,这很有效),以下是步骤:

  1. 将您的输出传送到less(或运行less filename.txt)。
  2. / 向前搜索(或按? 向后搜索)。
  3. 输入您的搜索词(默认为正则表达式,或先按Ctrl-r 切换为使用简单字符串)。按Enter
  4. 搜索词将突出显示。按n 移动到下一个匹配项,或按N 移动到上一个匹配项。
  5. q退出。

【讨论】:

  • ++ 我一直在使用的好工具。除了我使用/? + Enter ,重复搜索,用于寻找前/后,所以我懒惰的手指不必移动太多。不知道Ctrl-r,难怪我对`\`键变得如此友好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 2011-11-15
  • 1970-01-01
  • 2022-01-13
  • 2013-02-20
相关资源
最近更新 更多