題 grep可以顯示上下文,但不是完整的行嗎?


我有一個有很長行的文件。我想要grep一個字符串,該字符串可能在文件中出現多次,包括在一行上可能多次出現。

$ cat 2014-11-03.json | grep 218

這會產生不可讀的輸出。它太多了。

$ cat 2014-11-03.json | grep -o 218

這減少了太多。它僅顯示沒有任何上下文的匹配模式。

基本上,我想輸出像

... <category_id>218</category_id> ...

(是的,這是XML,但我不想解析XML。我只想輸出匹配的字符串,其中包含幾個字符。只有幾個字符,而不是整行。)

Grep似乎有選擇顯示 只要 匹配的字符串,或其整行上下文中的匹配字符串(默認行為),或前後幾行上下文中的匹配字符串,但我找不到在上下文中顯示匹配字符串的選項之前和之後的幾個字符。

$ cat 2014-11-03.json | tr ' ' '\n' | grep 218 

這並不理想:只要有問題的文件在大致正確的位置有空格,它就能正常工作。這次對我有用,但不能保證會再次出現。


3
2017-11-05 12:11


起源


是否 比賽前後的Grep角色? 救命? - DavidPostill♦
我發現使用過濾器如 sed <XMLfile 's/></>\n</g' | grep ... 在處理沒有換行的XML文件時非常有用。 - AFH
有關: 如何使grep輸出適合屏幕的字符寬度 - G-Man


答案:


這個問題已經過時了,但是因為我在尋找一種方法只能看到一部分線路時偶然發現它,所以這裡是:

解決方法是啟用“僅匹配”選項,然後使用RegExp的功能來比文本更多:

grep -o ".\{0,50\}WHAT_I_M_SEARCHING.\{0,50\}" ./filepath

當然,如果你使用顏色突出顯示,你可以再次grep再次只為實際匹配著色:

grep -o ".\{0,50\}WHAT_I_M_SEARCHING.\{0,50\}"  ./filepath | grep "WHAT_I_M_SEARCHING"

注意:

  • 如果每行有多個匹配項,則可能無法返回所有預期結果:。{0,50}可能與以下匹配項的一部分匹配,從而阻止匹配。
  • 這個正則表達式很慢。非常慢。 (見可能解決方案的評論)

7
2017-11-26 10:34



加速它的一個選項是在對包含WHAT_I_M_SEARCHING的行進行grepping以減小範圍後運行它。 - Jozef Legény
確實是好主意 - Jehan Bruggeman


投注方式我知道以漂亮的格式顯示json是使用pjson。格式化後,您可以添加grep命令。

$ echo '{"test1":"t1","test2":"t2"}' | pjson
{
   "test1": "t1",
   "test2": "t2"
}

安裝它 pip

pip install pjson

然後,管道任何json內容 pjson


0
2017-11-05 13:55



我得到的是奇怪的XML包裝在JSON中。它是非常長的XML字符串,所以即使是JSON格式化程序也可能留下非常長的行。我認為一個更通用的解決方案,而不是關心日誌文件的格式,會更適合。 (除此之外,儘管如此 .json 擴展,這不是真的JSON:每一行都是一個獨立的JSON文檔。) - TRiG