我有一個要使用 grep 命令決議的檔案,該檔案由如下幾行組成:
NVO,0,267,61,247357,247357,O,19:00:00.000000,06:09:08.417320,07:55:22.068670
DVD,0,267,61,247357,247357,O,19:00:00.000000,06:09:08.417320,07:55:22.068670
NVO,0,267,61,247358,247358,B,19:00:00.000000,06:09:08.417407,07:55:22.079291
DVD,0,267,61,247358,247358,B,19:00:00.000000,06:09:08.417407,07:55:22.079291
我只想得到以 NVO 開頭的行,并且行中有 ,B, 。輸出應如下所示:
NVO,0,267,61,247358,247358,B,19:00:00.000000,06:09:08.417407,07:55:22.079291
獲得NVO,我使用的線grep ^NVO, file_name.txt ,但我無法添加第二個條件,B,
我試過grep '^NVO,|,B,' file_name.txt,也
grep ",B," | grep "^NVO," file_name.txt
不幸的是,我知道我可以用兩個命令來完成,第一個是寫入檔案,然后是,B,用過濾器執行第二個 grep 命令
uj5u.com熱心網友回復:
您嘗試的操作實際上并不需要組合兩個grep呼叫。因此,您可以使用
grep "^NVO,.*,B," file > outfile
詳情:
^- 字串開始NVO,- 一個NVO,字串.*- 任何文本(任何零個或多個字符),B,- 一個,B,文本。
請參閱在線演示:
#!/bin/bash
s='NVO,0,267,61,247357,247357,O,19:00:00.000000,06:09:08.417320,07:55:22.068670
DVD,0,267,61,247357,247357,O,19:00:00.000000,06:09:08.417320,07:55:22.068670
NVO,0,267,61,247358,247358,B,19:00:00.000000,06:09:08.417407,07:55:22.079291
DVD,0,267,61,247358,247358,B,19:00:00.000000,06:09:08.417407,07:55:22.079291'
grep "^NVO,.*,B," <<< "$s"
輸出:
NVO,0,267,61,247358,247358,B,19:00:00.000000,06:09:08.417407,07:55:22.079291
uj5u.com熱心網友回復:
為那些實際上有充分理由將兩個單獨的grep呼叫組合在一起的人添加這個- Wiktor 的回答適合您的情況,而您不適合。
這里的問題是你的最后一個副本grep完全忽略了第一個副本的輸入,因為你傳遞了一個檔案名來讀取——所以它讀取檔案并忽略前一個實體。(此外,您沒有告訴第一個 grep 從何處獲取輸入,因此它是從 stdin 讀取的)。
您可以通過將檔案名傳遞給管道的第一個組件來解決這個問題:
grep ",B," input_file | grep "^NVO," >output_file
...或將輸入檔案作為標準輸入傳遞:
<input_file grep ',B,' | grep '^NVO,' >output_file
或者,如果您想將兩個greps 視為一個單元,并在最后傳遞它們的 stdin 和 stdout,您可以這樣做:
{ grep ',B,' | grep '^NVO,'; } <input_file >output_file
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/358764.html
