2011-09-15 52 views
0

使用目錄我有多個文件,這些文件中有多個版本號。我在目錄中爲這些版本號刷新每個文件,對它們進行排序以獲取最新的版本號,然後將它們編入'tail -1',只讀入最新的版本號,而不是每個grep結果。返回數據直到第N次出現字符X

的數據看起來是這樣的:

文件1:ASDF垃圾1.2.4.1 garbagetext ASDF

文件2:fsdaf垃圾asdfsda 4.3.2.10 fdsaf

等。我已經完成了提取最新的版本號。我做了以下幾點:

grep -o '[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}' * | sort | tail -1 

接下來的部分是我遇到的麻煩。我試圖在第一個時間段之前提取數字(無論是一個數字字符還是兩個數字字符)並返回該結果。然後,我假設一個稍微不同的命令做同樣的事情,但在第一個時期後的數字。第二階段之後,第三階段之後的數字又是如此。

我幾乎沒有sed或awk的經驗,但經過一些研究後,我相信任何一種工具都可以實現這一目標。

謝謝!

編輯:好的我明白了,但我確信這可以用更簡單的方法完成。我有以下內容:

grep -o '[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}' * | sort | tail -1 | grep -o '[0-9]\{1,\}' | sed -n 2p 

或sed -n 1p,3p,4p取決於我想要的值。

+0

你的grep行可能會失敗,如果有兩個數字在開始之一。例如12.3.4.555和3.4.5.77。我認爲你的grep | sort | tail會給你後一個,這不是最新的版本。 – Kent

回答

1

,以獲得最新的版本號:

grep -P -o "\d+\.\d+\.\d+\.\d+" * |sed 's/.*://g'|awk -F'.' '{v[$0]=($1"."$2$3$4)+0;}END{m=0;for(x in v)if(v[x]>m){m=v[x];n=x;}print n}' 

提取號碼:

kent$ echo "10.2.30.4"|awk -F'.' -v OFS="\n" '$1=$1'  
10 
2 
30 
4 

你可以把兩行在一起。

0

要提取的版本號,而不必知道有多少點是在裏面,我會用

grep -o '[0-9.]\+' filename | sort --version-sort | tail -1 

(假設你有GNU排序,與--version-sort選項)

得到公正主要版本號,管道以上到

相關問題