すべてのファイルで、他の文字列の後に続くすべての文字列を見つけます。

すべてのファイルで、他の文字列の後に続くすべての文字列を見つけます。

私の究極の目標は、すべてのファイルから各ユーザー名のインスタンスを計算するスクリプトを作成することです。

ユーザー名は、「login」という文字列の後に続く引用符で囲まれた文字列です。たとえば、ファイルに次のものがあるとします。

{"this":"is', {"a":"strange"}, "type":{"of":"object", "but":"please"},
 "go":"withit", "login":"username1"}

{"this":"is', {"login":"username2"}, "type":{"of":"object", "but":"please"},
 "go":"withit"}

他のファイルには次のものがあります。

{"this":"is', {"a":"strange"}, "type":{"of":"object", "but":"please"},
 "go":"withit", "login":"username3"}

{"login":"username1", "please":"gowithit"}

この場合、各ユーザー名がファイルに表示される回数を含むdictオブジェクトを含むtxtファイルが必要です。

{"username1": 2, "username2":1, "username3":1}

私はいろいろ読んだ。もの到着得るスタート、しかし合うことはできないようです。擬似コーディングをしましたが、この時点ではこれ以上進めません。

私の考えでは、これを2つのステップに分けて行う必要があると思います。

1) すべてのユーザー名のリストを取得します。

2)各ユーザー名がすべてのファイルに表示される回数を数えます。

タスク1)の場合:

 grep 'login:' * | sed 's/^.*: //'
#Except I think this gets everything from the line after 'login', which isn't what I want.

タスク2)の場合:

for all_usernames_in_file:
     stringval = username_read_from_saved_file
     cat * | grep -c $stringval > output.txt

誰でもここに持って行けますか?

編集する:

私はこれをしなければならないという意味です。

grep -o 'login":"[^"]*"' /path/to/dir/* | cut -d'"' -f3 | sort | uniq -c | sed '1i{ s/\s*\([0-9]*\)\s*\(.*\)/"\2": \1,/;$a}' > output.txt

編集2:まだ動作しません。各命令がどのような役割を果たしているのかを理解して診断してみたいと思います。

この部分から始めるとしましょう。

grep -o 'login":"[^"]*"' /path/to/dir/* | cut -d'"' -f3 | sort | uniq -c > myfile.txt

myfile.txt空です。

私はコマンドが次のことをしていると思います。

grep -o一致する行の空でない部分と一致します。

'login":"[^"]*"'grep が一致させる文字列です。真ん中にある[^"]ものは、等しくない後のすべての文字と一致します。これは、すべての長さの一致を望むことを意味します。つまり、ユーザー名の長さは重要ではなく、引用符の間にすべてが必要です。login":""*

|パイプラインだ。 「じゃあ」という意味

cut -d '"' -f3login":"区切り文字を使用して返された行(以降のすべての項目)を分割し、"フィールド3(ユーザー名のみ)を使用することを意味します。

|パイプラインだ。 「じゃあ」という意味

sortユーザー名

|パイプラインだ。 「じゃあ」という意味

一意のユーザー名を取得し、各ユーザー名の発生回数を計算します。

そのように多くの数を取り、> myfile.txt最後にaを追加すると、ユーザー名と各ユーザー名の発生回数を含むtxtファイルが生成されます。形式がうまく指定されていませんがあります。

なぜそのようなファイルを取得できないのですか?

注:.json.gzフォーマットされたファイルを検索しても問題はありますか?検索時に機能するスクリプトを取得しましtxtたが、他の形式では機能しません。

ベストアンサー1

ログインと値を常に空白なしで二重引用符で囲むと仮定すると、これはgrepとcountの構成です。

grep -o 'login":"[^"]*"' * | cut -d'"' -f3 | sort | uniq -c

これにより、複数回発生したログインのリストが生成されます。

これに基づいて、必要なjson形式を設定する必要があります。sedあなたのためにこれを行うことができます:

| sed '1i{
       s/\s*\([0-9]*\)\s*\(.*\)/"\2": \1,/;$a}'

これによりチャンクの開始と終了がsed配置され、出力が目的のjson形式に変更されます。{}uniq

UPD:最終コマンドは次のようになります。

grep -o 'login":"[^"]*"' * | cut -d'"' -f3 | sort | uniq -c | sed '1i{
       s/\s*\([0-9]*\)\s*\(.*\)/"\2": \1,/;$a}' > file.txt

おすすめ記事