
在 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>'
。