2017-01-16 24 views
2

我有一個包含大量收集日誌的日誌文件,我已經使用正則表達式輸出grep命令,該正則表達式輸出與之匹配的行數。 這是grep命令我匹配線使用,以輸出:在特定範圍內剪切的Bash腳本

grep -n -E 'START_REGEX|END_REGEX' Example.log | cut -d ':' -f 1 > ranges.txt 

正則表達式是有條件它可以匹配開始特定的日誌或它的端部的,所以輸出是這樣的:

12 
45 
128 
136 
... 

這個想法是使用它作爲範圍的來源,使日誌文件從第一個數字到第二個數據進行特定的剪切,並將它們保存在另一個文件中。
範圍由輸出的夫婦組成,根據示例,第一個範圍是12,45,第二個範圍是128,136
我期望在最終文件中看到來自12 to 45行的所有文本,然後是128 to 136。 我面臨的問題是sed命令似乎只能在一個範圍內工作。

sed -E -iTMP "$START_RANGE,$END_RANGE! d;$END_RANGEq" $FILE_NAME 

有什麼辦法(可能與awk)這樣做,只是在一個「循環」? 約束:我只能使用支持的bash命令。

+4

請澄清一下從源構成範圍,也給示例輸入和輸出。 – 123

+0

在考慮精心製作的grep之前,您究竟首先想到了什麼? – kabanus

+0

謝謝我更新了答案。 – Andrea

回答

2

隨着sed你可以做線的多個範圍,像這樣:

sed -n '12,45p;128,136p' 

這將輸出線12-45,然後128-136。

+2

我不認爲他們想要使用硬編碼的值 – 123

+0

@ 123,變量應該可以很好地代替那些。 –

+1

是的工作!當我嘗試使用多個範圍時,我錯過了'p'。謝謝! – Andrea

2

您可以使用awk聲明,也

awk '(NR>=12 && NR<=45) || (NR>=128 && NR<=136)' file 

其中,NRAwk其保持行號的軌道,因爲它處理文件的特殊變量。

一個例子,

seq 1 10 > file 
cat file 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
awk '(NR>=1 && NR<=3) || (NR>=8 && NR<=10)' file 
1 
2 
3 
8 
9 
10 

您也可避免通過使用-v可變選項硬編碼的行號,

awk -v start1=1 -v end1=3 -v start2=8 -v end2=10 '(NR>=start1 && NR<=end1) || (NR>=start2 && NR<=end2)' file 
1 
2 
3 
8 
9 
10