1

一時ファイルを使用せずに、現在のディレクトリ内の各ファイルで正規表現を検索するシェルスクリプトを作成しようとしています。

もともと、私は一時ファイルを使用してこれを保存しecho * | sed 's/ /\n/g'、このファイルの各行をループして、catそれぞれを使用して式をgrepし、出力の行を数えました。一時ファイルの検索に問題があり、変数または一時ファイル以外の方法を使用してすべてを実行できるかどうか疑問に思っていました(一時ファイル用に別のディレクトリを作成する必要もありません)。

変数で私が抱えていた問題は、変数の値をの出力に設定した後echo * | sed 's/ /\n/g'、ファイルから式の数を取得できるように、各行をループする方法がわからなかったことです。

私は次のことを機能させたいだけです(式をハードコーディングします):

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

file2に式のインスタンスが最も多いことを意味します(そのうち28個)。

4

3 に答える 3

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
于 2012-08-03T07:51:43.737 に答える
1

同様のバージョンのJobLinソリューションは、sedの代わりにsortargsを使用します。

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

(ここでは、「d」で始まる行を探します)

于 2012-08-03T08:00:55.150 に答える
0

これにより、countsを使用したtestと呼ばれるディレクトリ内の一連のファイルの上位10個の最も一般的な小文字の単語(正規表現を変更して変更)が表示されます。

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

ファイル名でカウントする場合は、grepのhフラグを削除します

  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
于 2012-08-03T08:27:06.430 に答える