顯示所有輸出但突出顯示搜尋匹配項

顯示所有輸出但突出顯示搜尋匹配項

在 bash 中,如果我想執行命令並僅顯示與特定模式匹配的輸出行,我可以將其通過管道傳輸到grep,例如

文件測試文件

hello
there
my
friends

命令

$ cat testfile | grep 'hello'
hello #this will be highlightd

這將突出顯示搜尋匹配項並顯示它所在的整行。我可以使用-A-B來顯示該行之前和之後的行。我的問題是是否可以執行命令並正常顯示所有輸出,但要像 grep 那樣突出顯示搜尋匹配項?所以我的輸出是

hello #highlighted
there
my
friends

答案1

要使用 Color GREP 僅突出顯示匹配的模式而不以其他方式更改輸出:

grep --color=always -e "^" -e "hello" testfile

第一個模式將匹配所有行(所有行都將被列印),第二個模式(以及任何後續模式)導致匹配的文字以顏色突出顯示。

由於第一個模式匹配所有行,但不匹配可列印字符,因此它不會添加任何顏色突出顯示,因此不會與突出顯示文字的可讀性競爭/幹擾。

答案2

-z向 GNU grep 指令新增選項:

cat testfile | grep --color=always -z 'hello'

或更短

grep --color=always -z 'hello' testfile

答案3

這個可以與 GNU grep 以及 FreeBSD 上的 grep 一起使用:

grep --color=always 'hello\|$'

它符合文字“hello”或 ( \|) 每行末尾的不可列印空字串 ( $)。這就是為什麼每一行都會被列印,但只有“hello”被突出顯示。

您可能已經--color=auto在 shell 中進行了配置。那麼您很可能不需要指定--color=always

grep 'hello\|$'

您也可以使用egrep(使用擴充正規表示式)更簡單的版本,其中|「or」表達式不需要轉義:

egrep 'hello|$'

另請參閱 StackOverflow 上的類似問題:彩色 grep — 查看整個檔案並突出顯示匹配項

答案4

這是一個使用 的解決方案ripgrep,它是一種現代、更易於使用(IMO)且更快的替代方案grep

cat my-file | rg --passthru '<REGEX>'

您也可以輕鬆自訂「螢光筆顏色」:

# dark red foreground with light yellow background:
cat my-file | rg --passthru --colors match:fg:124 --colors match:bg:229 '<REGEX>'

man rg網路版)。


為了日常使用,我創建了一個 shell 別名:

# in .bashrc
alias hl='rg --passthru --colors match:fg:124 --colors match:bg:229'

現在就這麼簡單cat my-file | hl '<REGEX>'

相關內容