2016-06-14 30 views
1

線我用獲得兩個從殼

cmd | egrep 'ID|Value' 

andget我的命令行下面的輸出:

ID: 2 
Value: 21 
    ID: 1 
Value: 25 
    ID: 1 
Value: 22 
    ID: 3 
Value: 56 
    ID: 1 
Value: 23 
    ID: 2 
Value: 50 
    ID: 2 
Value: 56 
    ID: 3 
Value: 11 
    ID: 3 
Value: 26 

我想通過一個特殊的ID進行過濾。但是當我使用:

egrep 'ID: 1|Value' 

它會顯示相同的輸出只有ID 1,但所有ID的值。

我已經閱讀過關於awk,sed和regex的內容,但是我找不到能夠真正幫助我的任何東西,但我也沒那麼深入。

有人可以提出一個想法,或告訴我,這是一個錯誤的方法來處理它,我應該以不同的方式做,如何?

輸出通緝:

ID: 1 
Value: 25 
    ID: 1 
Value: 22 
    ID: 1 
Value: 23 
+0

所以你想要顯示包含'ID:1'的塊以及包含'Value:25'的以下行嗎? – fedorqui

+0

我添加了我想要的輸出 – DaPole

回答

8

只要告訴grep與下一個一起打印匹配行:

$ grep -A1 'ID: 1$' file 
    ID: 1 
Value: 25 
    ID: 1 
Value: 22 
-- 
    ID: 1 
Value: 23 

man grep

-A NUM, --after-context = NUM​​

在匹配行後打印尾行上下文的NUM行。 在 連續的匹配組之間放置一個包含組分隔符( - )的行。使用-o或 - 僅匹配的 選項,這不起作用並給出警告。

請注意使用$來標記行結束。否則,這將匹配線路ID: 1323423423

如果你不喜歡--出現在比賽之間,擺脫它具有:

grep -A1 --no-group-separator 'ID: 1$' file 
#  ^^^^^^^^^^^^^^^^^^^^ 
+0

是的,這應該就夠了。 – Alan

+2

請注意,-A1的意思是「之後」,如果你想要的行之前,你可以使用-B1(「之前」 – Alan

+2

@Alan準確。如果你的「之後」和「之前」匹配,你可以加入他們使用'-C – fedorqui

5

使用awk

awk '/ID: 1/{line[NR]; line[NR+1]}; NR in line' file 

會給作爲輸出的另一種簡單的腳本: -

ID: 1 
Value: 25 
    ID: 1 
Value: 22 
    ID: 1 
Value: 23 

NR是一個特殊的awk存儲記錄號碼的變量。我們所做的只是匹配一個模式,並獲取要在文件中打印的行中的NthN+1th記錄,並確保要打印的記錄完全位於該行的最大範圍內(NR in line)。

+1

這是我第一次看到'NR' ... +1這種用於創造力的用途。希望我會記住它...... – anishsane

6

對於其它標籤:

AWK

awk '/ID: 1$/ {print; getline; print}' 

SED,非常相似

sed -n '/ID: 1$/ {p;n;p}' 

和bash

while read line; do if [[ $line == *"ID: 1" ]]; then echo "$line"; read line; echo "$line"; fi; done 
+2

這就是不切割和粘貼的問題。 –

1

使用GNU sed(有時可用的溶液如gsed BSD系統):

$ sed -n -e '/ID: 1/,+1p' data.in 
    ID: 1 
Value: 25 
    ID: 1 
Value: 22 
    ID: 1 
Value: 23 

說明:sed腳本「/ID: 1/,+1p」上在範圍/ID: 1/+1輸入的所有行施加p(打印)指令,即,每一行指定正則表達式「 ID: 1「和」沿着一條線「(+n地址是POSIX標準的GNU擴展)。

-n標誌爲sed可確保只打印p命令打印的內容(「禁止自動打印圖案空間」)。

0

這可能爲你工作(GNU SED):

sed '/ID: 1$/!d;n' file 

刪除任何行不ID: 1,然後打印出來下。