2016-08-11 45 views
1

我想問問是否可以將-v和-A結合起來?grep的-v選項與-A選項

我有例如文件:

abc 
1 
2 
3 
ACB 
def 
abc 
1 
2 
3 
ABC 
xyz 

與-AI可以看到我想 「切」 的部分:

$ grep abc -A 4 grep_v_test.txt 
abc 
1 
2 
3 
ACB 
-- 
abc 
1 
2 
3 
ABC 

它有一些選項來指定一些只看到

def 
xyz 

我找到了這個答案 - Combining -v flag and -A flag in grep但它不爲我工作,我想

$ sed -e "/abc/{2;2;d}" grep_v_test.txt 
sed: -e expression #1, char 8: unknown command: `;' 

$ sed "/abc/2d" grep_v_test.txt 
sed: -e expression #1, char 6: unknown command: `2' 

$ sed "/abc/+2d" grep_v_test.txt 
sed: -e expression #1, char 6: unknown command: `+' 

桑達版本:

$ sed --version 
GNU sed version 4.2.1 

EDIT1:基於 上評論我嘗試了兩種解決方案一點點,但它不工作,我想

grep -v -A 1 abc我希望線ABC和1被刪除,但其餘將被打印awk 'c&&!--c; /abc/ {c=2}' grep_v_test.txt只打印包含2的行,這不是我想要的。

非常相似它是sed的

$ sed -n '/abc/{n;n;p}' grep_v_test.txt 
2 
2 

EDIT2: 看來,我不能夠正確地描述它,讓我再試一次。

grep -A N abc file做的是在abc後面打印N行。我想刪除什麼grep -A將顯示,所以在文件

abc 
1 
2 
3 
ACB 
def 
DEF 
abc 
1 
2 
3 
ABC 
xyz 
XYZ 

我就刪除部分ABC美國廣播公司,我會打印休息:

ABC
ACB

DEF
DEF
ABC
ABC
XYZ
XYZ

所以4線將保持... awk的溶液打印只是清晰度和xyz和跳過DEF和XYZ ...

+0

只需使用'awk' ---->'awk'c &&!--c;/abc/{c = 5}'文件' – fedorqui

+0

感謝您的答案,它工作正常,但我仍然想知道使用sed的答案(與awk相比,我是一個更大的朋友)。 – Betlista

+0

然後使用[使用sed打印下一行](http://stackoverflow.com/a/3820821/1983854),以便獲得'sed -n「/ abc/{n; n; n; n; n; p}」 file'。 – fedorqui

回答

2

要跳過5行內容開始以初始匹配行的是:

$ awk '/abc/{c=5} c&&c--{next} 1' file 
def 
xyz 

其他相關腳本請參見Extract Nth line after matching pattern

WRT下面的評論,這裏的這個答案和@fedorqui's answer之間的區別:

$ cat file 
now is the Winter 
of our discontent 
abc 
1 
2 
bar 

$ awk '/abc/{c=3} c&&c--{next} 1' file 
now is the Winter 
of our discontent 
bar 

$ awk '/abc/ {c=0} c++>2' file 
bar 

如何看@ fedorqui的腳本無條件地跳過第2行的文件?

+0

我不清楚看到有什麼區別。當我更改文件「abc」 - >「x abc」的內容並使用了相同的命令時,看起來,您的語句「只做你想做的事情,因爲abc發生在文件的開頭。」是不正確的。我不清楚(也在鏈接頁面上)這個'1'和'{next}'用於... – Betlista

+1

當你把'abc'改成'x abc'時,並沒有改變'abc '出現在文件開頭 - 你沒有從第一行刪除'abc',你只是在同一行添加了其他東西。嘗試在您的當前第一行之前放入像'foo'這樣的全新行。 '1'是一個真正的條件,它導致打印當前記錄的默認行爲發生,這是一種非常常見的awk慣用語。 'next'告訴awk停止處理當前記錄。如果您打算進行任何文本操作,我推薦Arnold Robbins編寫的「有效的Awk編程」第4版。 –

+1

@Betlista我編輯了我的答案,包括一個例子來向你展示2個腳本之間的區別。 –

2

如果我理解你正確,你想要打印所有匹配後出現4行的所有行。

爲此,您可以調整在Extract Nth line after matching pattern的解決方案,並說:

$ awk '/abc/ {c=0} c++>4' file 
def 
DEF 
xyz 
XYZ 
+0

謝謝,這看起來和我想要的完全一樣,但正如我所說的,我並不是awk的好朋友......現在看起來很簡單...... – Betlista

+0

@Betlista你可以嘗試在'sed'中寫這個,但它可能會變得瘋狂,因爲它是一個一個一個地用線條做事情的工具。我更喜歡'awk',因爲考慮到所有上下文,使用文件來做事情是很好的。它也很整齊:) – fedorqui

+0

我已經喜歡你的解決方案。我希望像grep一樣簡單的檢查/ wothout -v,並從'C++> 4'改爲'C++ <= 4'非常簡單;-) – Betlista