2017-11-10 3 views
1

ファイル内で特定の単語を検索し、見つからなかった単語のみを表示したいのですが。grepでリスト文字列が見つかりません

egrep -w "^bower_components|^npm-debug.log" .gitignore 

.gitignoreファイルがbower_componentsなくNPM-debug.logにが含まれていた場合、それはを返します:これまでのところ、この分野での私の限られたスキルを持つ、私は言葉が発見されていますbower_components。私は見つけられなかった模様の一部だけを返すように求める方法を見つけたいと思う。つまり、返信するのはnpm-debug.logです。私は検索結果と一致しないファイルからすべてのテキストを見たいとは思っていません。それ、どうやったら出来るの?

答えて

2

私はあなたのための1つのライナーを持っていませんが、短いスクリプトがあなたのユースケースのために働くでしょう。

file=$1 
shift 
for var in "[email protected]" 
do 
    found=`grep "^$var" $file` 
    if [[ -z $found ]] 
    then 
    echo $var 
    fi 
done 

説明、ファイル名としてファイルにテストするための文字列として、後続の引数を最初の引数を取ります。それらの引数をループし、grepコマンドの結果をテストして、空に戻ったかどうかを確認します。そうであれば文字列は見つからず、コンソールに出力します。 使用法:[script name] .gitignore bower_components npm-debug.log

+0

私は少し答えを微調整する必要があり、それが最も簡単なこのきれいにレイアウトされ、読みやすいbashスクリプトを微調整することが判明しました。 – ccalvert

1

これはgrepだけではできないと思います。ここでは不器用なawkのワンライナーです:

awk -v p1="npm-debug.log" -v p2="bower-component" 'BEGIN{a[p1]=0;a[p2]=0} $0 ~ p1 {a[p1]+=1}; $0 ~ p2 {a[p2]+=1}; END{for(i in a){if(a[i]==0){print i}}}' .gitignore 

私は、彼らが一致してのみ」didnのものを印刷する場合、それらをインクリメントし、インデックスとしてパターンを使用してアレイを事前移入、変数としてのawkに検索パターンを渡していますヒットしました(まだ0です)。

0

あなたの例のような単純な言葉がある場合は、2つのgrepコマンドを1つのライナーで実行することができます。

ファイル:

first line 
_another line 
just another line 
STRANGE LINE 
last line 

言葉:

first 
last 
row 
other 
^another 
LINE$ 

たちができる最初の取得マッチしたパターンが

> grep -owf words file 
first 
LINE 
last 

し、我々grep -v例えばfまたはwordsにあります。また、中にはuniqを追加して重複を削除してください。

ので最終的に、我々はfileにマッチしていないwordsからパターンを取得する:

> grep -owf words file | uniq | grep -vf - words 
row 
other 
^another 
関連する問題