2

私は、通常は手作業で行う作業を自動化しようとしています。つまり、複数のユーザーのアクセス許可からデータベース出力を取得し、それらを比較して、共通点を確認します。現在、commとpasteを使用するスクリプトがありますが、必要なすべての出力が得られません。

問題の一部は、一度に2つのファイルのみを処理する通信にあり、傾向を見つけるために少なくとも3つを比較する必要があります。また、3つのうち2つに共通点があるかどうかを判断する必要がありますが、3つ目には共通点がありません(したがって、2つのcommコマンドの出力を比較しても機能しません)。Excelにインポートできるように、これらをコンマで区切った値にする必要があります。各ユーザーには列があり、最後に共通するすべてのリストがあります。commは、3つ以上のファイルを比較できれば(そして3つのうち2つの比較を表示できれば)完全に機能します。

コードに加えて、生のcsvファイルから余分な部分をすべて削除する必要があります。これまでに4人のユーザーを比較した結果です。それは非常に非効率的ですが、それは私が知っていることです。

cat foo1 | sort > foo5
cat foo2 | sort > foo6
cat foo3 | sort > foo7
cat foo4 | sort > foo8

comm foo5 foo6 > foomp
comm foo7 foo8 > foomp2

paste foomp foomp2 > output2
sed 's/[\t]/,/g' output2 > output4.csv
cat output4.csv

現在、これは2人のユーザー、それらの類似点と相違点を出力し、次に別の2人のユーザーに対して同じことを行い、それを一緒に貼り付けます。これは手作業よりもうまく機能しますが、もっと多くのことができると思います。

入力ファイルの例は次のようになります。

User1

Active Directory
Internet
S: Drive
Sales Records

User2

Active Directory
Internet
Pricing Lookup
S: Drive

User3

Active Directory
Internet
Novell
Sales Records

ADとインターネットが共通している場合、3つのうち2つが販売記録へのアクセスとS:ドライブの許可を持ち、それぞれの1つだけがNovellとPricingへのアクセスを持っています。

誰かが私に欠けているものを手に入れることができますか?

4

3 に答える 3

1

プログラムをご利用いただけますdiff3。マニュアルページから:

   diff3 - compare three files line by line

上記のサンプル入力を考えると、実行diff3結果は次のようになります。

====
1:3,4c
  S: Drive
  Sales Records
2:3,4c
  Pricing Lookup
  S: Drive
3:3,4c
  Novell
  Sales Records

これにより、探しているものに近づくことができますか?

于 2012-05-01T13:31:48.917 に答える
1

GNU AWK(gawk)を使用すると、複数のユーザーの権限がどのように相関しているかを示す表を印刷できます。また、Bash 4、Python、Perlなど、連想配列(ハッシュ)をサポートする任意の言語で同じことを行うことができます。

#!/usr/bin/awk -f
{
    array[FILENAME, $0] = $0
    perms[$0] = $0
    if (length($0) > maxplen) {
        maxplen = length($0)
    }
    users[FILENAME] = FILENAME
}
END {
    pcount = asort(perms)
    ucount = asort(users)
    maxplen += 2
    colwidth = 8
    printf("%*s", maxplen, "")
    for (u = 1; u <= ucount; u++) {
        printf("%-*s", colwidth, users[u])
    }
    printf("\n")

    for (p = 1; p <= pcount; p++) {
        printf("%-*s", maxplen, perms[p])
        for (u = 1; u <= ucount; u++) {
            if (array[users[u], perms[p]]) {
                printf("%-*s", colwidth, "  X")
            } else {
                printf("%-*s", colwidth, "")
            }
        }
    printf("\n")
    }
}

このファイルを保存し、おそらく「相関」と呼んでから、実行可能に設定します。

$ chmod u+x correlate

次に、ファイル名がユーザー名に対応している、またはその他の意味があると仮定すると(例は「user1」から「user3」であるため、うまく機能します)、次のように実行できます。

$ ./correlate user*

サンプル入力に基づいて、次の出力が得られます。

                  user1   user2   user3
Active Directory    X       X       X
Internet            X       X       X
Novell                              X
Pricing Lookup              X
S: Drive            X       X
Sales Records       X               X

編集:

このバージョンは使用しないためasort()、GNU以外のバージョンのAWKで動作するはずです。欠点は、行と列の順序が予測できないことです。

#!/usr/bin/awk -f
{
    array[FILENAME, $0] = $0
    perms[$0] = $0
    if (length($0) > maxplen) {
        maxplen = length($0)
    }
    users[FILENAME] = FILENAME
}
END {
    maxplen += 2
    colwidth = 8
    printf("%*s", maxplen, "")
    for (u in users) {
        printf("%-*s", colwidth, u)
    }
    printf("\n")

    for (p in perms) {
        printf("%-*s", maxplen, p)
        for (u in users) {
            if (array[u, p]) {
                printf("%-*s", colwidth, "  X")
            } else {
                printf("%-*s", colwidth, "")
            }
        }
    printf("\n")
    }
}
于 2012-05-01T18:14:02.337 に答える
0

文字列コマンドを使用してファイルからバイナリを削除し、それらをまとめてから、連結されたファイルでuniq -cを使用して、文字列の出現回数を取得します。

于 2012-05-01T13:34:35.453 に答える