2016-06-12 12 views
-1

現在、私はにgetentデータベースを実行すると、それは次の形式で私の結果が得られます:私は私を実行結果をテキストファイルと比較するためのシェルスクリプト?

string1,number 
    string2,number 
    string3,number 

毎回:

string1,string2,string3,string4,string5 

を、私はこの形式ですべてのものを持っているテキストファイルを持っています私のデータベースの内容を取得し、テキストファイルと比較したいと思います。

string1,number 
    string2,number 
    string3,number 
    string4,number 
    string5,number 

プリティ新:私のテキストファイル内に終了しないデータベース内に新しい文字列がある場合、私は、テキストファイルにはなりますので、乱数と私のテキストの最後に新しい文字列を書きたいですシェルに...私は調べるべき最善の方法と構文ですか?

+0

'string1、string2、string3、string4、string5'はスクリプトに入力されていますか? – Ola

+0

これはcomamnd "getentデータベース"の出力です。http://www.tutorialspoint.com/unix_commands/getent.htm – user3669481

答えて

2

基本

を例としてgetentからこの出力を取る:

それは
    仕組み
    $ getent passwd daemon | while IFS=: read s1 s2 s3 rest; do printf "%s,%s\n" $s1 $RANDOM $s2 $RANDOM $s3 $RANDOM; done 
    daemon,7721 
    x,9604 
    1,2061 
    

    :あなたは経由して要求として

    $ getent passwd daemon 
    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin 
    

    我々はそれを処理することができます

  • getent passwd daemon

    これを、必要なデータを生成するコマンドgetentに置き換えます。

  • |

    これは、次のコマンドの入力にgetentの出力を供給するためにシェルに指示。

  • while IFS=: read s1 s2 s3 rest; do

    これは、標準入力の次の行から4つの変数を読み取ることによってwhileループを開始します。 getentの出力はコロンで区切られているので、IFS:と設定します。

    質問では、getentの出力をコンマで区切って表示します。その場合は、IFS=:IFS=,に置き換えてください。

  • printf "%s,%s\n" $s1 $RANDOM $s2 $RANDOM $s3 $RANDOM

    これは、ランダムな数字と最初の3つの文字列変数の出力を追加印刷します。

  • done

    これはwhileループの終わりを知らせます。複数行に広がる彼らのシェルコマンドを好む人のために

  • から

マルチライン:

getent passwd daemon | while IFS=: read s1 s2 s3 rest 
do 
    printf "%s,%s\n" $s1 $RANDOM $s2 $RANDOM $s3 $RANDOM 
done 

参照ファイルを比較し、更新

これが存在するかどうかを確認します最初の3つの文字列のいずれかがtestfileにあり、testfileに追加されています。

getent passwd daemon | while IFS=: read s1 s2 s3 rest; do for s in "$s1" "$s2" "$s3"; do grep -qE "^$s," testfile || printf '%s,%s\n' "$s" "$RANDOM">>testfile; done; done 

あるいは、複数行の形式で:

getent passwd daemon | while IFS=: read s1 s2 s3 rest 
do 
    for s in "$s1" "$s2" "$s3" 
    do 
     grep -qE "^$s," testfile || printf '%s,%s\n' "$s" "$RANDOM">>testfile 
    done 
done 
+0

getentの出力にいくつの変数が含まれるかわからない場合はどうすればいいですか?それは4か5か6かもしれないが数は変化している。また、テキストファイルを開いて、どの変数がすでに存在するかを比較し、ファイルに終了しない変数を書き込む方法はありますか? – user3669481

+0

上記の出力は、出力に4,5、または6のフィールドがあるかどうかに関係なく機能します。出力に「乱数」があることを尋ねました。それらの乱数が既存のファイルのデータと「比較」されているときに、あなたは何をしたいですか? – John1024

+0

数字は比較されませんが、数字の前の変数が比較されるので、基本的にs1、s2、s3はテキストファイルの文字列と比較されます – user3669481

1

declare -Aによって設定されたbashの連想配列を知って取得し、次の2つの文の間の特定の違い:

echo 'A: ${strings[@]}='"${strings[@]}"; 
echo 'B: ${!strings[@]}='"${!strings[@]}"; 

A bash連想配列のクイック検索はthis tutorialとなりました。

あなたは見ても、bashに新しく追加されたよう:

  1. IFS環境変数とどのように影響を与える読み取り機能。以下のよう
  2. ライン:for num in ${numbers//,/ }; do echo $num; done;
0

私は私はあなたの問題文を理解し、完全に確認していません。 しかし、私は理解できるものから、これはうまくいくかもしれない:

$ cat file1 
string1,number1 
string2,number2 
string3,number3 

$ cat file2 
string1,string2,string3,string4,string5 


$ awk -F, 'NR==FNR{a[$1]++; print; next}{for (i=1;i<=NF;i++)if (!($i in a)) print $i"," (int(10000*rand()));}' file1 file2 

string1,number1 
string2,number2 
string3,number3 
string4,2377 
string5,2910 

注:ここで使用
番号10000だけで任意の数です。必要に応じて変更します。
また、固有の問題のため、レコードの数が多い場合、これらの乱数が繰り返される可能性があります。

コードの説明
最初のファイルの配列aに既存の「文字列」を記録します。 file2の処理中に、配列aにエントリが見つからない場合は、乱数で新しいエントリを出力します。

関連する問題