題:
突出顯示而不是過濾器的“ Grep”
ordago
2014-12-05 13:47:33 UTC
view on stackexchange narkive permalink

我想知道通用的unix工具集中是否有一個程序(例如grep),而不是過濾包含字符串的行,而是僅輸出相同的輸入但突出顯示或著色所選字符串,而不是對其進行過濾。

我當時在想自己做(應該很簡單),但是也許它已經作為unix命令存在了。

我打算用它來監視日誌,所以我會做這樣的事情:

  tail -f logfile.log |突出顯示“錯誤”  

通常,當我監視日誌時,我需要找到一個特定的字符串,但是我還需要知道該字符串前後所寫的內容,因此有時過濾是不夠的。

是否存在類似的東西?

謝謝

幾乎可以在這裡回答:http://stackoverflow.com/questions/981601/colorized-grep-viewing-the-entire-file-with-highlighted-matches
這對我來說似乎是題外話,因為它不要求提供應用程序。當然最好在https://unix.stackexchange.com/上詢問
十四 答案:
fedorqui
2014-12-05 16:44:24 UTC
view on stackexchange narkive permalink

使用基本的 grep 命令可以解決這個問題。它包括使用兩個過濾器:您要應用的一個過濾器和一個匹配所有行但不產生高光的虛擬過濾器。此虛擬匹配項可以是 ^ (行的開頭)或 $ (行的結尾)。

  grep“ ^ \ | text “ --color ='always'文件 

  grep -E” ^ | text“ --color ='always'文件 

查看示例:

  $ cat ahello這是我想與您分享的一些文本$ grep“ ^ \ | text” --color ='always'ahello這是我想要的一些文字#高亮顯示“文字”以便與您共享 
看起來您甚至不需要`^`或`$`,而`“ | text”`也可以。
user450
2014-12-05 14:54:22 UTC
view on stackexchange narkive permalink

有一個名為 ack 的工具。您可以在 http://beyondgrep.com上找到它,它確實是grep以外的工具。它最常見的用途是填充 find的角色。名稱“ * .java” --print | xargs grep clazz 之類。因為我們一直都這樣做。

只需 ack clazz ,您就會得到輸出。搜索適當的文件(不必費心嘗試grep二進製文件),並給出不錯的顏色輸出。

如果將它與-passthru 選項一起使用,它將打印整個輸入流,突出顯示顏色匹配的區域。

-passthru 打印所有行,無論是否匹配

如文檔中所述,如果文件使用-,它將採用STDIN:

如果指定了任何文件或目錄,則僅檢查那些文件和目錄。 ack也可以搜索STDIN,但前提是未指定文件或目錄參數,或者其中一個參數是“-”。

因此,請原諒 cat 濫用( 和雙關語-見下文 sup> sub>),您可以使用它:

  $ cat文件| ack --passthru pattern $ cat文件| ack --passthru pattern- 

這將獲取管道的輸出,並將其通過 ack 發送,該命令將打印所有行(使用- -passthru ),並突出顯示該模式。

這正是您所追求的工具(還有更多)。它是許多軟件包管理器的標準軟件包。請參閱 http://beyondgrep.com/install/中最喜歡的內容。

 _ /|\'o.O'=(___)= U ack --thpppt!

(如果您不認識它,儘管圖像搜索可能也有幫助,但 Bill the Cat還是有幫助的-不要單擊Miley Cyrus套裝)

Ack是一個很棒的工具,但是如何僅突出顯示搜索模式就可以打印整個輸入呢?正如您所解釋的,它通常用作目標grep -R的一種形式,我不知道它如何幫助OP。
@terdon的--passthru選項將打印所有線條並突出顯示感興趣的圖案。同樣,對於使用STDIN的用戶,可以將連字符用作文件“名稱”,或者根本不使用文件參數。
我知道,這很有意義。既然您說過它就像grep一樣,我就假定它只會打印匹配的行。
@terdon的默認模式是grepy。儘管人們已經指出了其他選擇,但是可以欺騙grep打印所有行並突出顯示感興趣的文本。 ack不需要被欺騙去做-它是標準選項之一。並感謝您所做的澄清編輯。
Steve Barnes
2014-12-05 14:04:50 UTC
view on stackexchange narkive permalink

您可以使用 grep -C 標誌,該標誌給出n行上下文,例如 grep -C 3 將在比賽前後打印3行。之前和之後還有 -B -A

如果您希望定期突出顯示給定的字符串,例如特定的日誌格式,可能值得將python pygmentize自定義詞法分析器一起使用,因為它是基於正則表達式的,所以您會驚訝它的簡單程度。。後者還具有跨平台的優勢,儘管某些終端的顏色效果不佳。

terdon
2014-12-06 18:17:12 UTC
view on stackexchange narkive permalink

我已經編寫了一個小腳本,該腳本將為您提供的任何字符串著色:

 #!/ usr / bin / env perluse Getopt :: Std; use strict; use Term :: ANSIColor;我的%opts; getopts('hic:l:',\%opts); if($ opts {h}){print<<EoF;使用-l指定要突出顯示的模式。要指定多個模式,請使用逗號。 -l:要著色的Perl正則表達式。可以將多個表達式作為逗號分隔值傳遞:-l foo,bar,baz -i:使搜索區分大小寫-c:逗號分隔的顏色列表; EoF exit(0); } my $ case_sensitive = $ opts {i} || undef; my @ color =('大膽的紅色','大膽的藍色','大膽的黃色','大膽的綠色','大膽的洋紅色','大膽的青色','黃色on_magenta','bright_white on_red','bright_yellow on_red','white on_black'); if($ opts {c}){@ color = split(/,/,$ opts {c});}我的@patterns; if($ opts {l}){@ patterns = split(/,/,$ opts {l});} else {$ patterns [0] ='\ *';}#設置$ |設置為非零會立即強制刷新,並在#在當前選定的輸出通道上進行每次寫入或打印後立即刷新。 $ | = 1; while(my $ line = <>){for(我的$ c = 0; $ c< = $#patterns; $ c ++){if($ case_sensitive){if($ line =〜/ $ patterns [$ c] /){$ line =〜s /($ patterns [$ c])/ color(“ $ color [$ c]”)。$ 1.color(“ reset”)/ ge; }} else {if($ line =〜/ $ patterns [$ c] / i){$ line =〜s /($ patterns [$ c])/ color(“ $ color [$ c]”)。$ 1。 color(“ reset”)/ ige; }}} print STDOUT $ line;}  

如果將其另存為 color $ PATH 中的目錄中,並且將其設置為可執行文件( chmod + x / usr / bin / color ),您可以像這樣為匹配的樣式上色:

  echo -e“ foo \ nbar \ nbaz \ nbib” | color -l foo,bib  

將產生:

enter image description here

如所寫,腳本為10種不同的模式提供了預定義的顏色,因此,如上例所示,為它提供一個逗號分隔的列表將為每個以不同顏色匹配的模式著色。

ryanmjacobs
2014-12-07 12:48:54 UTC
view on stackexchange narkive permalink

我是Paolo Antinori的hhighlighter粉絲。 https://github.com/paoloantinori/hhighlighter

此命令的另一面是,它最多可以突出顯示10個具有獨特顏色的單詞。命令 h 並突出顯示單詞。

例如 tail -f /var/log/somelog.log | h“錯誤” 將產生:

demo-1


他網站上的一些示例:

demo-2 demo-3

slebetman
2014-12-05 18:29:39 UTC
view on stackexchange narkive permalink

前一段時間,我編寫了一個程序來執行此操作。我稱之為cgrep(用於彩色grep)。

您可以通過將代碼部分從此處複製到一個空文件中來下載它: http://wiki.tcl.tk/38096

然後將文件設置為可執行文件,並將其複製到常規bin目錄之一。

它是用tcl編寫的,因此您需要安裝tcl(8.5及更高版本)。但是大多數Linux發行版仍然會安裝tcl,因為許多軟件都使用了tcl(gitk,內核配置,期望等)。

著色的語法很簡單: regex option option .. 。您可以根據需要使用任意多個正則表達式。下面是一個示例,該錯誤將紅色錯誤標記為黃色,將警告消息標記為黃色:

  tail -f logfile | cgrep'^。*警告。* $'-fg黃色'^。* ERROR。* $'-fg紅色-bg黃色 
Zandriy
2018-08-01 21:13:32 UTC
view on stackexchange narkive permalink

我認為最簡單的方法如下:

  tail -f logfile.log | grep -e'錯誤'-e'**' 

enter image description here

無需安裝任何內容。

John V
2014-12-06 02:05:41 UTC
view on stackexchange narkive permalink

好吧,我正在運行Fedora 21,如果我鍵入

  grep -E \ | kk rs.c  

,它將輸出整個突出顯示任何出現的“ kk”時文件“ rs.c”的內容。

這基本上與[arielCo的答案](http://softwarerecs.stackexchange.com/a/14435/185)相同。
@Izzy:雖然語法較短,所以我想說它有資格作為其他有效答案。
-1
arielCo
2014-12-05 21:43:02 UTC
view on stackexchange narkive permalink

一個簡單的技巧就是匹配一個空字符串或一行的開頭;要么導致所有行的零長度匹配:

  grep --color -e'REGEXP'-e''grep --color -e'REGEXP'-e ^  

或(擴展的regexp語法):

  grep --color -E'REGEXP |'egrep --color'REGEXP |' 
第一個變體也不會過濾REGEX的輸出嗎?我只是嘗試過,而且確實如此。因此,這與要求不符(僅突出顯示,不過濾)。但是第二個變量確實可以執行OP所要求的(已驗證;)。
-1
是的,現在這很有意義:)過濾“ REGEX”(突出顯示該術語)和“無”(即“無處不在”)。我是否可以建議您包括這個小解釋(太清楚了它的作用),然後我們刪除我們的註釋(以進行清理)?謝謝!同時從我+1 :)
可以,但是Fedorqui在上面給出了基本相同的答案(我想我發布我的時候沒有看到它)。
必須承認我也沒有看到……(提示:這裡沒有“之上”或“之下”,因為答案的順序取決於您設置的過濾器;)
Steven Penny
2014-12-07 10:59:49 UTC
view on stackexchange narkive permalink

您可以使用此命令

  grep --color --context = 1000  

或更短

  grep --col -1000  

explainshell.com-grep --color --context

asmeurer
2014-12-08 00:54:09 UTC
view on stackexchange narkive permalink

使用 less 。通過 / 找到的搜索字符串是一個正則表達式,並且出現的內容將突出顯示。

simesy
2018-05-23 04:29:03 UTC
view on stackexchange narkive permalink

在我的.bashrc中,我具有此功能。我稱它為 cgrep ,但在這裡給它起一個更恰當的名稱。

  highlight(){grep -E --color“ ^ | $ 1” ; }  

例如,我發現這對於尾隨日誌很有用,我想突出顯示關鍵字,但可以看到一切。

  tail -f / var / log / SOMELOG |突出顯示關鍵字 
到期信用:我得到了“ ^ |”來自@fedorqui's的想法選擇了答案。謝謝 :)
Monty Harder
2014-12-05 23:37:02 UTC
view on stackexchange narkive permalink

您可以通過管道將輸出發送到:

  sed“ s / \([Ee] [Rr] [Rr] [Oo] [Rr] \)/`tput rev` \ 1`tput rmso` /“  

在這裡,我使用的正則表達式將在所有32種可能的變體中匹配“ error”,“ ERROR”,“ ErRoR”等。 >

Benedikt Köppel
2014-12-07 04:48:33 UTC
view on stackexchange narkive permalink

我在〜/ .zshrc 中定義了以下函數:

  hl(){sed s / $ 1 / $'\ e [1; 31m '\ & $'\ e [0; m'/}  

tail -f logfile.log一起使用| hl“錯誤” 。它將在突出顯示的單詞之前添加淺紅色的轉義序列,並在單詞之後將其重置為無顏色。您可以在此處找到其他顏色代碼: http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...