2012-08-03 23 views
1

我正在嘗試編寫一個shell腳本,它將在不使用臨時文件的情況下在當前目錄中的每個文件中搜索正則表達式。在目錄的所有文件中查找表達式的頻率

最初,我使用臨時文件來存儲echo * | sed 's/ /\n/g',然後遍歷該文件的每一行,每個行使用cat,然後擦除我的表達式並計算輸出行。我在搜索臨時文件時遇到了一些麻煩,並想知道是否可以使用變量或一些非臨時文件方法(我並不想爲臨時文件創建單獨的目錄)做所有事情。

我用變量遇到的問題是,我已經設置了變量的echo * | sed 's/ /\n/g'輸出的值之後,我不知道如何通過每個線路迴路,所以我可以得到這些文件的表達計數。

我只想工作情況如下(這裏我硬編碼的表達式):

% ls 
% file1 file2 file3 
% ./countMost.sh 
% file2(28) 
% ls 
% file1 file2 file3 

這標誌着文件2有表達(其中28)的大多數情況下。

回答

2

你可以嘗試這樣的事情:

grep -c regex files | sed -e 's/^\(.*\):\(.*\)$/\2 \1/' | sort -r -n | head -n 1 

哪裏regex是你的正則表達式(可以使用egrep以及)和files是文件列表。

鑑於3個文件:

file1: 
qwe 
qwe 
qwe 
asd 
zxc 

file2: 
qwe 
asd 
zxc 

file3: 
asd 
qwe 
qwe 
qwe 
qwe 

,我跑:

grep -c 'qwe' file[1-3] | sed -e 's/^\(.*\):\(.*\)$/\2 \1/' | sort -r -n 

我得到的輸出:

4 file3 
3 file1 
1 file2 

此外,在末尾添加| head -n 1只給我:

4 file3 
1

的工作琳解決類似的版本使用的排序ARGS而不是sed的:

grep -c -e "^d" file* | sort -n -k2 -t: -r |head -1 

(這裏我找起了「d」線)

0

這應該給你的十大最常用的小寫字(你改變正則表達式換成什麼)在一堆名爲dir的文件裏,這個文件被稱爲測試計數。

grep -rhoE "[a-z]+" test | sort | uniq -c | sort -r | head 
     3 test 
     2 wow 
     2 what 
     2 oh 
     2 foo 
     2 bar 
     1 ham 

如果要通過文件名的計數,然後取出H標誌的grep上

grep -roE "[a-z]+" test | sort | uniq -c | sort -r | head 
     3 test/2:test 
     1 test/2:wow 
     1 test/2:what 
     1 test/2:oh 
     1 test/2:foo 
     1 test/2:bar 
     1 test/1:wow 
     1 test/1:what 
     1 test/1:oh 
     1 test/1:ham 
相關問題