2016-09-09 46 views
0

我的同事今天有一個有趣的問題,grep。 她正在製作一個bash腳本,它似乎在使用curl從那裏拉動一個網頁,並使用grep來拉動錨點。從格式輸出格式中獲得最大索引

她的榜樣輸出現身爲:

file-1  
    file-10 
    file-2 
    file-20 
    file-3 
    file-4 

這是因爲他們看到的是第一個數字,並把它們在其「訂單」預期的那樣grep排序。

她最終做出了一個for循環來抓取最新的輸出。但它讓我好奇。

在上面的例子中,我將如何獲得file-20在一行命令

。我試過sortawk。無法獲取但是工作:/

+1

爲什麼會用grep進行排序?輸出應該按照grep找到匹配的順序。 –

回答

2

您需要:

  • 使用數字排序:-n標誌sort
  • 排序的數字列:使用-t指定列分隔符,並-k指定列
  • 獲取最後一行與tail -n1

想要這樣:

sort -n -t- -k2 input | tail -n1 
+0

簡單,在一條線。謝謝你的解釋。 –

1

用awk可以在單個命令做到這一點:

awk -F- '$2>max{max=$2; s=$0} END{print s}' file 

file-20 

我們通過拆分連字符每一行,並檢查第二場。我們將變量max作爲運行值保持最大值,然後我們在$2中獲得更高值。每當我們設置max時,我們也將全行存儲在變量s中。在END部分,我們只打印變量s

+1

我喜歡這一個,並且愛你解釋它謝謝你。不得不接受另一個,因爲它更簡單,她最終喜歡使用那個。我必須先用'awk'讓自己更加面向自己,所以非常感謝你。 –

+0

*簡單*實際上是主觀術語。 'awk'在單個命令中對兩個命令進行了處理,即'sort + tail',如果輸入文件很大,那麼'sort'也會相當慢。 – anubhava

+0

耶你的權利。我的意思是比較簡單,就像我學到的第一個命令是grep,sort和tail/head。awk是我在學習的東西,所以其他人是最容易使用的思想,我想哈哈。請務必記住awk對於更大的文件會更好! –

1

您可以使用sort進行排序-數字分開的第二場,和head -1拿到第一個:

sort -t'-' -k2,2rn | head -1 

例子:

% cat file.txt       
file-1  
file-10 
file-2 
file-20 
file-3 
file-4 

% sort -t'-' -k2,2rn file.txt   
file-20 
file-10 
file-4 
file-3 
file-2 
file-1  

% sort -t'-' -k2,2rn file.txt | head -1 
file-20 
+0

同一個只是使用尾巴,而不是因爲它是第一個看到謝謝你! –

+1

@ KyleCalica-St注意不同之處在於'-k'選項的尾部,實際上可以對特定部分使用'-n'(數字),'-r'(反向)等操作,而不是全部通過用'-k'添加相關選項來完成。另外,如果有更多的拖尾字段,另一個會窒息,那麼在使用'-k'時應始終提及起始和結束字段。 – heemayl