2012-07-20 52 views
0

好吧,所以我無法弄清楚這一點。就像我使用grep來獲取特定信息的文件一樣,它的設置就像這樣。Grep對於一件事,然後從下面的線切割

#aaaa 
<numbers 123456> 

blah 
blah 
blah 

#bbbb 
<numbers 2156488> 

blah 
blah 
blah 

#cccc 
<numbers 5478624> 

blah 
blah 
blah 

我做什麼是我greping爲aaaabbbbcccc,而我真正需要的信息是數字。正如當我grep aaaa我想獲得的東西只是它下面的數字。在這種情況下,它會123456

我知道如何grep爲aaaa,但我不知道如何去下一行和削減數量。

回答

4

您可以使用grep-C選項顯示一行上下文。然後你可以在最後一行tail-n 1),cut使用空格並選擇第二個字段,cut再次使用>並選擇第一個字段。因此:

$ grep aaaa file -C 1 | tail -n 1 | cut -f2 -d' ' | cut -d'>' -f1 
123456 

將返回您請求的號碼。

最重要的部分是-C選項grep

+0

這是一個GNU'grep'擴展。由於這是Linux的標籤,這是公平的,但它無處不在。 – 2012-07-20 15:15:07

+6

你也可以在比賽結束後使用'-A 1'選項來替代之前和之後的1線。 – 2012-07-20 15:15:19

+0

是的,但仍然需要「尾巴」,因爲比賽線仍然會顯示。因此,沒有更新命令長度。 至於這是一個GNU擴展的事實,我承認我不知道它。因爲我不知道其他'grep's我會保留答案並刪除它,如果提問者告訴他這不是他需要的:) – 2012-07-20 15:20:17

2

它看起來更像sed工作對我說:

sed -n '/^#[a-z]\{4\}/{ N; s/#.*\n<numbers //; s/>//p; }' 

-n說默認情況下不打印。 /^#[a-z]\{4\}/尋找像#aaaa; { ... }內的操作僅適用於此類行。 N的意思是'讀下一行';第一個s///刪除號碼前的材料;第二個刪除尾部>並打印。

還有其他關於如何做「刪除無關材料」的選項,比如只有一個替代命令:s/[^0-9]*\([0-9][0-9]+\).*/\1/;這會捕獲第一串數字並刪除其他所有數據。它將處理比最初顯示的更多約束正則表達式更多的輸入變化。從樣本數據

輸出:

123456 
2156488 
5478624 

這不是自動sed的作業;改變它,以便有趣的信息是比賽之後的第三條線,並且在sed(儘管N;N;N;很可能是做所需的)時會變得很煩。

+0

這也可以用'awk'或者'sed'來實現/更清潔的方式? – 2012-07-21 02:35:13

+0

當您找到標記線時,可以使用'getline'函數通過'awk'來讀取下一行。 – 2012-07-21 03:07:20

0

@拉爾斯Kotthoff

您使用-A 1選項的建議的工作完美!

使用您輸入的答案是這樣的:

grep "aaaa" file -A 1 | grep "<numbers" | cut -d" " -f2 | cut -d">" -f1 

我很樂意給你的信用爲這一個!

+2

謝謝,但它已經在所有其他答案:) – 2012-07-20 15:27:17

5

使用SED:

sed -n '/aaaa/{ 
N 
s/[^0-9]*\([0-9]*\).*/\1/p 
}' input_file 
0

如果您未在grep
+0堅持以擺脫 「>」

awk 'f{print $2+0; exit} /^#aaaa/{f=1}' foo.txt 

或者

awk 'f{print $2+0; f=0} /^#aaaa/{f=1}' foo.txt 
0

試試這個:

for i in "aaaa bbbb" 
do 
sed -n '/'"$i"'/,+1 p' test |tail -n1|cut -d' ' -f2| sed 's/.$//' 
done 

它效率不高,但工作很好。