2013-11-23 71 views
0

我有一個索引HTML文件與文件/目錄列表。它只是一個像通常的文件瀏覽器:bash命令來匹配n行

...content here...  
<td><a href="20130011/">20120011/</a></td> 
<td><a href="20130111/">20120111/</a></td> 
<td><a href="20130211/">20120211/</a></td> 
<td><a href="20130411/">20120411/</a></td> 
...content here... 

我不明白如何從底部提取第二行。

1)我下載HTML,捲曲

content=$(curl -sL "http://path-to-html") 

2)然後使用

dir=$(echo $content | sed '/.*href="\([0-9]*\/\)".*/!d;s//\1/;q') 

這給了我最後一場比賽:20120411

但是如何獲得前一個?

我不知道項目的總數。

回答

3

程序位將打印倒數第二行:

echo ${content} | awk '{ pen = ult; ult = $0 } END { print pen }' 

這將打印倒數第二匹配的行

echo ${content} | awk '/href="([0-9]{8}\/)"/ { pen = ult; ult = $0 } END { print pen }' 

如果你j烏斯季要提取的第一個捕獲組:

echo ${content} | awk 'match($0, /href="([0-9]{8}\/)"/, a) { pen = ult; ult = a[1] } END { print pen }' 

全部放在一起:

bash-4.2$ dir=$(curl -sL http://www.arteetmarte.no/tmp/index.html | 
    awk 'match($0, /href="([0-9]{8}\/)"/, a) { 
     pen = ult 
     ult = a[1] 
    } 
    END { 
     print pen 
    } 
    ') 
bash-4.2$ echo ${dir} 
20130918/ 

測試了:GNU Awk 4.1.0, API: 1.0

+0

無法理解這對我的情況有何幫助。正則表達式和打印pre-last匹配... –

+0

我已經上傳了tmp文件,嘗試它,不工作'dir = $(curl -sL「http://www.arteetmarte.no/tmp/index.html」| awk -F''''{pen = ult; ult = $ 2} END {print pen}')' –

+0

@DmitriA:由於您的數據與問題中的數據看起來如此不同,我已經更新了我的答案。 – Johnsyweb

0

可能會更容易與

dir=$(echo "$content"|awk '/href=/{x=p;p=$0}END{sub(/.*">/,"",x);sub(/<.*/, "",x); print x}') 
+0

謝謝,如何使用它?爲我返回一個空字符串。 –

+0

@DmitriA,看到編輯後的版本 – iruvar

+0

好了,只是試圖像這樣沒有運氣:'含量= 「​​20120011/​​20120111/​​20120211/​​20120411/」 DIR = $(回聲 「$內容」 | awk的「/ href =/{x = p; p = $ 0} END {sub(/.*">/,「」,x); sub(/<.*/,「」,x); print x}')' –

0
dir=$(echo $content | sed sed -n '/href="\([0-9]\{1,\}\/\)"/ {s|.*href="\([0-9]\{1,\}/\)".*|-\1-|;H;} 
$ {x;l;s|.*-\([0-9]\{1,\}/\)-\(\n-[0-9]\{1,\}/-\)\{1\}$|\1|p;}') 

的1 \{1\}$指定多少行必須被移除從底