2016-12-25 21 views
-1

我有這個文件使用了兩個結果,一個grep的同時

something1 
something2 username": "John" something3 
something4 
.... 
something5 salaryunit="dollar" something6 
something7 

我想要得到這樣的結果

John dollar 

username": "John" salaryunit="dollar" 

,我已經試過

grep -oP 'username":".*?"\|salaryunit=".*?"' file 

但它會得到錯誤。怎麼了?

回答

0

考慮的一個版本grep(如GNU grep)由-P選項和支持-o選項啓用只打印什麼的匹配與PCRE(Perl兼容的正則表達式)的支持 - 無論它是由POSIX規定 - 那麼你需要在管道前放置反斜槓,並在問題中命令的第二個雙引號之前加一個空格。

鑑於數據文件:

something1 
something2 username": "John" something3 
something4 
.... 
something5 salaryunit="dollar" something6 
something7 
username": "John" salaryunit="dollar" 

運行中所示的命令產生所示的輸出:

$ grep -oP 'username": ".*?"|salaryunit=".*?"' file 
username": "John" 
salaryunit="dollar" 
username": "John" 
salaryunit="dollar" 
$ 

注意,當圖案上輸入的一行(最後在兩次相匹配樣本數據),則-o選項會在兩條單獨的行上輸出兩個單獨的匹配項。當匹配輸入在兩條獨立的線上時,當然,輸出也在兩條獨立的線上。

如果您要求'在單行上輸出',則需要指定想要作爲擴展文件的輸出的結果,還是要指定文件的二十個匹配文件的變體。如果您希望成對使用兩個條目,如果在兩個條目之間沒有salaryunit條目或兩個salaryunit條目之間沒有username條目或沒有username,會發生什麼情況?等

如果你有信心,項目總是成對出現,並且總是在序列username然後salaryunit,然後讓對線合併成單條線中的簡單的方法是:

$ grep -oP 'username": ".*?"|salaryunit=".*?"' file | paste -d ' ' - - 
username": "John" salaryunit="dollar" 
username": "John" salaryunit="dollar" 
$ 

- -表示法paste表示'從標準輸入讀取一行然後第二行並將組合打印爲單行'。默認情況下,行由製表符分隔;使用-d ' '意味着它們被一個空格分開。使用更長的分隔符不起作用;第一個字符用於分隔前兩個字段,字符串中的第二個字符分隔第二個和第三個字段,依此類推。

+0

感謝喬納森,它配對,我有很多文件,每個文件都有'用戶名'和'salaryunit',你能幫我把他們在一行結果 –

+0

你必須定義我最後一段中列出的所有問題在我明智地幫助將結果寫入單一行之前,再加上問題(1)'用戶名'總是出現在'salaryunit'?之前,並且(2)'每個文件每個關鍵字只包含一個條目? 「請編輯問題以添加額外信息 - 請勿將其添加爲註釋。 –

+0

是的,喬納森,這是肯定的,'用戶名'總是在'salaryunit'之前,每個文件只包含每個關鍵字的一個條目 –

相關問題